// Aplica o back-end do juninho
@target          : mips 
// Especifica o tipo de metodo empregado para salvar o resultado da compilação
@export          : simulation //MultCoreJun

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

// 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 = 4
    COL = 4
)

var (
    origin [LIN][COL]int32
    result [LIN][COL]int32
)

func preenche_matriz() {
    var (
        w = 1
        value int32
    )
    
    LM1 := LIN - 1
    CM1 := COL - 1

    for i := 0; i < LIN; i++ {
        for j := 0; j < COL; j++ {
            switch {
                case i == 0, i == LM1: // Primeira  e ultima linha
                    value = 0
                case j == 0, j == CM1: // Primeira e ultima coluna
                    value = 0
                default:               // Elementos do interior da matriz
                    value = w
                    w++
            }
            origin[i][j] = value
        }
    }
}

func laplaciano() {
    var (
        l int32
    )
    LM1 := LIN - 1
    CM1 := COL - 1

    for i:= 1; i < LM1; i++ {
        for j := 1; j < CM1; j++ {
            l = origin[i-1][j]
            l += origin[i][j-1] 
            l += origin[i][j+1] 
            l += origin[i+1][j] 
            l -= (4 * origin[i][j])

            if l > 255 { l = 255 }
            else if l < 0 { l = 0 }

            result[i][j] = l
        }
    }
}

func main() {
    preenche_matriz()
    laplaciano()
}
