#include "processor.h"


// Pilote du simulateur
// lit une addresse dans un fichier si il y a encore des addresses
// à lire et si la file d'attente n'est pas pleine
void Processor::driver()
{
    out_activate = false;

    // Si il y a encore des addresses à envoyer
    if (!file.eof()) {

        // Et que la file n'est pas pleine, alors on les envoie
        if (!queue->is_full()) {

            // Vide pour l'instant, c'est la donnée a charger
            int data;
            
            // RawAddresse à charger dans le cache...
            unsigned int address;

            // Lecture de l'addresse depuis le fichier
            file >> address;
            
            if (file.eof()){
                return;
            }

            cout << "lecture de " << dec << address << " dans le fichier" << endl;

            RawAddress *addr = new RawAddress(address);

            // Si il y a encore des addresses à envoyer
            cout << sc_time_stamp() << " Processor : request " << *addr << endl;

            // on ajoute la requete a la queue
            queue->insert(*addr);

            // Lecture :
            out_data = address;
            out_activate = true;
            read(*addr, &data);

        }
        //
        // Si la file est pleine, il faudra attendre un cycle dans la même
        // position
    }
}

// Est appelée lorsqu'une réponse depuis le cache L1 est envoyée.
void Processor::completed()
{
    if (in_activate) {
        cout << "processeur activé" << endl;
        cout << sc_time_stamp() << " Processor : la donnée " << in_data << " est arrivée" << endl;
        //queue->print();
        RawAddress address = in_data;
        queue->remove(address);
        cout << "--------------- processeur : état de la queue : " << endl;
        queue->print();
    }
}

void Processor::read(RawAddress &address, int *value)
{
    // ici, if ready
    out_data = address;
    out_activate = true;
}

void Processor::write(RawAddress &address, int value)
{
    // ici, if ready
    out_data = address;
}
