186 lines
3.8 KiB
C
186 lines
3.8 KiB
C
|
|
/*
|
|
----------------------------------------
|
|
| Adresse | Registre | Modifié |
|
|
----------------------------------------
|
|
| | | |
|
|
| | | |
|
|
| | | |
|
|
| i | 0x777756b8 | int |
|
|
| size | 0x777756b8 | int |
|
|
----------------------------------------
|
|
*/
|
|
|
|
#include "tables.h"
|
|
#define NB_REG 4
|
|
#define MEM_SIZE 1024
|
|
|
|
struct case_adresse tableau[MEM_SIZE];
|
|
int registres[NB_REG];
|
|
|
|
void init (void) {
|
|
int i;
|
|
struct case_adresse case_courante = {0, -1, 0};
|
|
for (i=0; i<MEM_SIZE; i++) {
|
|
case_courante.adresse = i;
|
|
tableau[i] = case_courante;
|
|
}
|
|
for (i=0; i<NB_REG; i++) {
|
|
registres[i] = 0;
|
|
}
|
|
}
|
|
|
|
void print_case_adresse(struct case_adresse case_courante) {
|
|
printf("{addr : %d ; reg : %d ; modi : %d}\n", case_courante.adresse, case_courante.registre, (int)case_courante.modifie);
|
|
}
|
|
|
|
void print() {
|
|
int i;
|
|
for (i=0; i<MEM_SIZE; i++) {
|
|
print_case_adresse(tableau[i]);
|
|
}
|
|
}
|
|
|
|
|
|
struct case_adresse get_info(int adresse) {
|
|
return tableau[adresse];
|
|
}
|
|
|
|
int get_adresse (int registre) {
|
|
int i = 0;
|
|
while (i < MEM_SIZE && tableau[i].registre != registre) {
|
|
i++;
|
|
}
|
|
if (i == MEM_SIZE) {
|
|
return -1;
|
|
} else {
|
|
return tableau[i].adresse;
|
|
}
|
|
}
|
|
|
|
void set_registre(int adresse, int registre) {
|
|
tableau[adresse].registre = registre;
|
|
}
|
|
|
|
void set_modifie(int adresse, char modifie) {
|
|
tableau[adresse].modifie = modifie;
|
|
}
|
|
|
|
void increment_time() {
|
|
int i;
|
|
for (i=0; i<NB_REG; i++) {
|
|
registres[i]++;
|
|
}
|
|
}
|
|
|
|
void refresh_registre(int registre) {
|
|
registres[registre] = 0;
|
|
}
|
|
|
|
int get_register() {
|
|
int i;
|
|
int index_max = 0;
|
|
for (i=0; i<NB_REG; i++) {
|
|
if (registres[index_max] < registres[i]) {
|
|
index_max = i;
|
|
}
|
|
}
|
|
return index_max;
|
|
}
|
|
|
|
int get_reg_write(int adresse, FILE * file) {
|
|
if (adresse == -1) {
|
|
int dispo = get_register();
|
|
int previous_addr = get_adresse(dispo);
|
|
if (previous_addr != -1) {
|
|
struct case_adresse ancienne_case = get_info(previous_addr);
|
|
if (ancienne_case.modifie == 1) {
|
|
fprintf(file, "STORE %d %d\n", previous_addr, dispo);
|
|
set_modifie(previous_addr, 0);
|
|
}
|
|
set_registre(previous_addr, -1);
|
|
}
|
|
return dispo;
|
|
} else {
|
|
set_modifie(adresse, 1);
|
|
struct case_adresse ma_case = get_info(adresse);
|
|
if (ma_case.registre == -1) {
|
|
int dispo = get_register();
|
|
int previous_addr = get_adresse(dispo);
|
|
if (previous_addr != -1) {
|
|
struct case_adresse ancienne_case = get_info(previous_addr);
|
|
if (ancienne_case.modifie == 1) {
|
|
fprintf(file, "STORE %d %d\n", previous_addr, dispo);
|
|
set_modifie(previous_addr, 0);
|
|
}
|
|
set_registre(previous_addr, -1);
|
|
}
|
|
set_registre(adresse, dispo);
|
|
refresh_registre(dispo);
|
|
return dispo;
|
|
} else {
|
|
refresh_registre(ma_case.registre);
|
|
return ma_case.registre;
|
|
}
|
|
}
|
|
}
|
|
|
|
int get_reg_read(int adresse, FILE * file) {
|
|
struct case_adresse ma_case = get_info(adresse);
|
|
if (ma_case.registre == -1) {
|
|
int dispo = get_register();
|
|
int previous_addr = get_adresse(dispo);
|
|
if (previous_addr != -1) {
|
|
struct case_adresse ancienne_case = get_info(previous_addr);
|
|
if (ancienne_case.modifie == 1) {
|
|
fprintf(file, "STORE %d %d\n", previous_addr, dispo);
|
|
set_modifie(previous_addr, 0);
|
|
}
|
|
set_registre(previous_addr, -1);
|
|
}
|
|
fprintf(file, "LOAD %d %d\n", dispo, adresse);
|
|
set_registre(adresse, dispo);
|
|
refresh_registre(dispo);
|
|
return dispo;
|
|
} else {
|
|
refresh_registre(ma_case.registre);
|
|
return ma_case.registre;
|
|
}
|
|
}
|
|
|
|
|
|
void flush_and_init(FILE * file) {
|
|
int i;
|
|
for (i = 0; i<MEM_SIZE; i++) {
|
|
if (tableau[i].registre != -1) {
|
|
if (tableau[i].modifie == 0) {
|
|
tableau[i].registre = -1;
|
|
} else {
|
|
fprintf(file, "STORE %d %d\n", i, tableau[i].registre);
|
|
tableau[i].registre = -1;
|
|
tableau[i].modifie = 0;
|
|
}
|
|
}
|
|
}
|
|
for (i=0; i<NB_REG; i++) {
|
|
registres[i] = 0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|