#include "VMS.h"
#include "vmalloc.h"
#include "loop.h"

bulb new_bulb() {
    bulb b = VMS__malloc((2*NUM_SCHED_SLOTS + 2)*sizeof(int));
    memset(b,0,(2*NUM_SCHED_SLOTS + 2)*sizeof(int));
    return b;
}

void set_bulb_member(bulb b, int i, int vp, int task){
    b[2*i]=vp;
    b[2*i+1]=task;
}

void set_bulb_core(bulb b, int core){
    b[2*NUM_SCHED_SLOTS] = core;
}

void set_bulb_id(bulb b, int id){
    b[2*NUM_SCHED_SLOTS + 1] = id;
}

void set_loop_file(FILE* file){
    loop_file=file;
}

void print_bulb_to_file(void* _b){
    bulb b = (bulb) _b;
    if(b[2*NUM_SCHED_SLOTS]!=0 || b[2*NUM_SCHED_SLOTS + 1]!=0)
        fprintf(loop_file,"sync%d_%d [shape=rect];\n",b[2*NUM_SCHED_SLOTS],b[2*NUM_SCHED_SLOTS + 1]);
    int i;
    for(i=0;i<NUM_SCHED_SLOTS;++i){
        if(b[2*i] != 0){
            fprintf(loop_file, "sync%d_%d -> VP_%d_%d;\n",b[2*NUM_SCHED_SLOTS],b[2*NUM_SCHED_SLOTS + 1],b[2*i],b[2*i+1]);
            fprintf(loop_file, "VP_%d_%d -> sync%d_%d;\n",b[2*i],b[2*i+1],b[2*NUM_SCHED_SLOTS],b[2*NUM_SCHED_SLOTS + 1] + 1);
        }
    }
}

int prev_slots[NUM_CORES][2*NUM_SCHED_SLOTS];

void print_per_slot_to_file(void* _b){
    bulb b = (bulb) _b;
    int i;
    for(i=0;i<NUM_SCHED_SLOTS;++i){
        if(b[2*i] != 0){
            if(prev_slots[b[2*NUM_SCHED_SLOTS]][2*i] != 0){
               fprintf(loop_file, "loopDep, %d, %d, %d, %d;\n",prev_slots[b[2*NUM_SCHED_SLOTS]][2*i],prev_slots[b[2*NUM_SCHED_SLOTS]][2*i+1],b[2*i],b[2*i+1]); 
            }
            prev_slots[b[2*NUM_SCHED_SLOTS]][2*i] = b[2*i];
            prev_slots[b[2*NUM_SCHED_SLOTS]][2*i+1] = b[2*i+1];
        }
    }
}