Untitled

 avatar
unknown
plain_text
4 years ago
3.4 kB
2
Indexable
#include "InterferenceGraph.h"
#include "Test.h"
#include "ResourceAllocationLib.h"
#include "Instruction.h"
#include "Constants.h"
 
#include <iostream>
#include <vector>
 
using namespace std;
 
static InterferenceGraph ig;
 
 
 
InterferenceGraph& buildInterferenceGraph(Instructions& instructions)
{
    // Here goes your code.
 
//////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////
 
    //1. dobavi listu promenljivih.
    ig.variables = &getVariables();
 
    //2. podesi velicinu matrice smetnji
    InterferenceMatrix interference_matrix;
    //resize broja kolona
    interference_matrix.resize(ig.variables->size());
    //resize sve kolone (da dobijes odg. broj vrsta)
    for(int i = 0; i < interference_matrix.size(); ++i)
    {
        interference_matrix.at(i).resize(interference_matrix.size());
    }
    //dodela matrice polju ig.matrix
    ig.matrix = interference_matrix;
 
    //3. treba proci kroz instrukcije
    Instructions::iterator iter = instructions.begin();
    for (iter; iter != instructions.end(); ++iter)
    {
        //treba da ne bude move
        if ((*iter)->type != InstructionType::move)
        {
            //iteriramo po def
            Variables::iterator var_iter = (*iter)->def.begin();
            for(var_iter; var_iter != (*iter)->def.end(); ++var_iter)
            {
                //sad iteriramo kroz out
                Variables::iterator var_iter_ = (*iter)->out.begin();
                for(var_iter_; var_iter_ != (*iter)->out.end(); ++var_iter_)
                {
                    //sad treba da proverimo da li ima smetnje izmedju varijabli
                    if((*var_iter)->pos != (*var_iter_)->pos)
                    {
                        //dodajemo smetnju u matricu smetnji
                        ig.matrix.at((*var_iter)->pos).at((*var_iter_)->pos) = __INTERFERENCE__;
                        ig.matrix.at((*var_iter_)->pos).at((*var_iter)->pos) = __INTERFERENCE__;
                    }
                    //ne treba else tj ne treba dodavati i cvorove koji nisu u smetnji
                }
 
            }
 
 
        }
    }
 
 
//////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////
 
    return ig;
}
 
 
void printInterferenceMatrix()
{
    if (ig.matrix.size() == 0)
    {
        cout << "There is nothing to print!" << endl;
        return;
    }
 
    cout << "==========================================" << endl;
    cout << "Interference matrix:" << endl;
    cout << "==========================================" << endl;
 
    // print existing variables in order to mark rows and columns
    for (auto varIt = ig.variables->begin(); varIt != ig.variables->end(); varIt++)
    {
        cout << "\t" << (*varIt)->name;
    }
    cout << endl;
 
    auto varIt = ig.variables->begin();
    for (auto it1 = ig.matrix.begin(); it1 != ig.matrix.end(); it1++)
    {
        cout << (*varIt++)->name;
        for (auto it2 = (*it1).begin(); it2 != (*it1).end(); it2++)
        {
            cout << "\t" << *it2;
        }
        cout << endl;
    }
    cout << "==========================================" << endl;
}
Editor is loading...