-
Notifications
You must be signed in to change notification settings - Fork 0
/
DM.java
69 lines (53 loc) · 2.22 KB
/
DM.java
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
import java.util.*;
import java.io.*;
public class DM {
private int Size, Block_size, rows, index_bits, tag_bits;
// private
public DM_row[] cache; // Array of DM_rows
DM(int size, int block_size) {
this.Size = size;
this.Block_size = block_size;
rows = (Size / Block_size); // calculate number of rows
index_bits = (int) (Math.log(rows) / Math.log(2)); // calculate number of index bits
tag_bits = 32 - index_bits - (int) (Math.log(block_size / 8) / Math.log(2)); // calculate number of tag
// bits.
cache = new DM_row[rows]; // Size of "cache array" will be same as number of rows.
for (int i = 0; i < rows; i++)
cache[i] = new DM_row();
}
// Access at the given address
boolean is_hit(String Address) // Returns true on a Hit , otherwise returns false.
{
String tag = Address.substring(0, tag_bits); // get the tag.
int index = get_index(Address);
boolean is_hit; // set to true on a hit otherwise set to false.
if (cache[index].getValid_bit() == 1 && cache[index].getTag().equals(tag))
is_hit = true;
else
is_hit = false;
return is_hit;
}
void Evict(String Address) {
int index = get_index(Address);
cache[index].setValid_bit(0);
cache[index].setData("");
}
void add_Data(String Address, String data) {
String tag = Address.substring(0, tag_bits); // get the tag.
int index = get_index(Address);
cache[index].set_tag(tag);
cache[index].setData(data);
}
String get_Data(String Address) {
int index = get_index(Address);
return cache[index].getData();
}
String get_tag(String Address) {
int index = get_index(Address);
return cache[index].getTag();
}
int get_index(String Address) {
int index = Integer.parseInt(Address.substring(tag_bits, tag_bits + index_bits), 2);
return index;
}
}