// Aplica o back-end do juninho
@target          : mipsjun 

// Diretorio onde o resultado da compilação será gravado
@outputDirectory : `C:\Users\EUGENIO CARVALHO\Desktop\tmp\comp`

// Quantidade de palavras de um bloco 32 palavras de 4bytes
@cacheBlockSize: `32`

/**
    Profile de compilacao do back-end
    O formato da string é um json que descreve um array de definições de cada core
    {
        "stackBaseAddress"   : 5888,     -> endereço da base da pilha do core em questão
        "initFunction": "multiplica(0)", -> define a main de cada core. aceita ate 4 parametros com valores de constantes
        "id": "core0"                    -> label que define o codigo de cada core
    },

    Se "stackBaseAddress" não for definido o compilador irá inferir o valor iniciando do ultimo endereço da memoria    
*/

@profile: `[
    {
        "id"               : "core0",
        "initFunction"     : "multiplica(0)",
        "filename"         : "%s_core_0.txt"
    },
    {
        "id"               : "core1",
        "initFunction"     : "multiplica(5)",
        "filename"         : "%s_core_1.txt"
    },
    {
        "id"               : "core2",
        "initFunction"     : "multiplica(10)",
        "filename"         : "%s_core_2.txt"
    },
    {
        "id"               : "core3",
        "initFunction"     : "multiplica(15)",
        "filename"         : "%s_core_3.txt"
    }
]`


package main;

const (
    LIN             = 20
    COL             = 20
    NUM_LINHAS_MULT = 5
)

var (
    matrizA [LIN][COL]int
    matrizB [LIN][COL]int
    matrizR [LIN][COL]int
)

func multiplica(initial int) {
    tmp   := 10
    aux   := 0
    x     := tmp + 1
    limit := initial + NUM_LINHAS_MULT
    for i := initial; i < x; i++ {
    //for i := initial; i < limit; i++ {
        for j := 0; j < COL; j++ {
            for k := 0; k < LIN; k++ {
                aux = aux + (matrizA[i][k] * matrizB[k][j])
            }
            matrizR[i][j] = aux
            aux = 0
        }
    }
}