#include "processor.h"

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

        // On active le composant recepteur
        out_activate = true;

        // 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()){
                out_activate = false;
                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);

            read(*addr, &data);
        }
        // Si la file est pleine, il faudra attendre un cycle dans la même
        // position
    }
    // Si il n'y a plus d'addresses à envoyer, on désactive la réception du
    // coté cache l1.
    else {
        // FIXME normalement, c'est superflu
        // on désactive la reception du coté du cache L1
        out_activate = false;
    }
}

void Processor::completed()
{
    if (in_activate) {
        cout << sc_time_stamp() << " Processor : la donnée " << in_data << " est arrivée" << endl;
        //queue->print();
        RawAddress address = in_data;
        queue->remove(address);
    }
}

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

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