#include "dependency.h"
#include "VMS_impl/VMS.h"

Dependency* new_dependency(int from_vp, int from_task, int to_vp, int to_task){
    Dependency* newDep = (Dependency*) VMS_int__malloc(sizeof(Dependency));
    if (newDep!=NULL){
        newDep->from_vp = from_vp;
        newDep->from_task = from_task;
        newDep->to_vp = to_vp;
        newDep->to_task = to_task;
    }
    return newDep;
}

NtoN* new_NtoN(int id){
    NtoN* newn = (NtoN*) VMS_int__malloc(sizeof(NtoN));
    newn->id = id;
    newn->senders = makeListOfArrays(sizeof(Unit), 64);
    newn->receivers = makeListOfArrays(sizeof(Unit), 64);
    return newn;
}

int set_dependency_file(FILE* file){
    dependency_file = file;
}

void print_ctl_dependency_to_file(void* _dep){
    Dependency* dep = (Dependency*) _dep;
    if(!dep) return;
    fprintf(dependency_file,"ctlDep,%d,%d,%d,%d\n",dep->from_vp,dep->from_task,dep->to_vp,dep->to_task);
}

void print_comm_dependency_to_file(void* _dep){
    Dependency* dep = (Dependency*) _dep;
    if(!dep) return;
    fprintf(dependency_file,"commDep,%d,%d,%d,%d\n",dep->from_vp,dep->from_task,dep->to_vp,dep->to_task);
}

void print_dyn_dependency_to_file(void* _dep){
    Dependency* dep = (Dependency*) _dep;
    if(!dep) return;
    fprintf(dependency_file,"dynDep,%d,%d,%d,%d\n",dep->from_vp,dep->from_task,dep->to_vp,dep->to_task);
}

void print_singleton_dependency_to_file(void* _dep){
    Dependency* dep = (Dependency*) _dep;
    if(!dep) return;
    fprintf(dependency_file,"singDep,%d,%d,%d,%d\n",dep->from_vp,dep->from_task,dep->to_vp,dep->to_task);
}

void print_hw_dependency_to_file(void* _dep){
    Dependency* dep = (Dependency*) _dep;
    if(!dep) return;
    fprintf(dependency_file,"hwDep,%d,%d,%d,%d\n",dep->from_vp,dep->from_task,dep->to_vp,dep->to_task);
}

void print_dependency_to_file(void* _dep){
    Dependency* dep = (Dependency*) _dep;
    if(!dep) return;
    fprintf(dependency_file,"VP_%d_%d -> VP_%d_%d;\n",dep->from_vp,dep->from_task,dep->to_vp,dep->to_task);
}

void print_unit_to_file(void* _unit){
    Unit* unit = (Unit*) _unit;
    if(!unit) return;
    fprintf(dependency_file,"unit,%d,%d,%p,%d\n",unit->vp,unit->task,unit->ret_ptr,unit->reqType);
}

void print_nton_set_helper(void* _u){
    Unit* u = (Unit*) _u;
    if(!u) return;
    fprintf(dependency_file,",%d,%d",u->vp,u->task);
}

void print_nton_to_file(void* _nton){
    NtoN* nton = (NtoN*) _nton;
    if(!nton) return;
    //assert(nton->senders->next_free_index==nton->receivers->next_free_index);
    int numInSet = nton->senders->next_free_index;
    fprintf(dependency_file,"NtoN,%d",numInSet);
    forAllInListOfArraysDo(nton->senders,&print_nton_set_helper);
    forAllInListOfArraysDo(nton->receivers,&print_nton_set_helper);
    fprintf(dependency_file,"\n");
}