-
Notifications
You must be signed in to change notification settings - Fork 0
/
directCache.c
94 lines (86 loc) · 2.26 KB
/
directCache.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#include "directCache.h"
struct DCache * DCache_Create (int taille) {
///à compléter
struct DCache * c=(struct DCache) malloc(sizeof(struct DCache));
c->taille=taille;
int T = (c->taille==0?0: (0x1<<c->taille));
c->table=(struct Ligne *) malloc(T * sizeof(struct Ligne));
int i;
for(i=0;i<T;i++){
c->table[i].tag =0;
c->table[i].valid=0;
c->table[i].word=0;
}
return c;
}
void DCache_Delete (struct DCache * c) {
///à compléter
if (c==NULL) return;
if (c->table == NULL){
free(c);
c=NULL;
return;
}
free(c->table);
c->table=NULL;
free(c);
c=NULL;
return;
}
void DCache_Disp(struct DCache *c) {
if (c==NULL) {
printf ("Cache directe non initialisée: %8lx\n", (unsigned long *) c);
return;
}
printf("Nombre de ligne: %d\n", (c->taille==0?0:(0x1<<c->taille)));
if (c->table==NULL){
printf ("Table non initialisée: %8lx\n", (unsigned long *) c->table);
return;
}
int i;
int T = (c->taille==0?0:(0x1<<c->taille));
printf ("--------------------------------Table:------------------------------------\n");
for (i=0;i<T;i++){
printf ("Tag: %10d | Valid: %1d | Word:",c->table[i].tag, c->table[i].valid);
afficheBits(c->table[i].word);
}
printf ("--------------------------------------------------------------------------\n");
return;
}
int getOffset(int adresse, struct DCache *c){
///à compléter
return SMOT(adresse,0,2);
}
int getIndex(int adresse, struct DCache *c){
///à compléter
return SMOT(adresse,2,c->taille);
}
int getTag(int adresse, struct DCache *c){
///à compléter
return SMOT(adresse,c->taille+2,32-(c->taille+2));
}
int setDCache(int adresse, int mot, struct DCache *c){
///à compléter
if (c==NULL) return 0;
int ligne = getIndex(adresse,c);
c->table[ligne].tag=getTag(adresse,c);
c->table[ligne].valid=1;
c->table[ligne].word=mot;
return 1;
}
int lwDC (int *registre, int adresse, struct DCache *c){
///à compléter
int ligne=getIndex(adresse,c);
int tag=getTag(adresse,c);
if ((c->table[ligne].valid) && (c->table[ligne].tag == tag)){
if ((registre) *registre = c->table[ligne].word)
return 1;
}
else{
//miss
//read word in memory word
setDCache(adresse,0,c);
if( (registre) *registre = c->table[ligne].word)
return 0;
}
}