From 2c635b3e434b17f62dde2b3e99c1027703df3242 Mon Sep 17 00:00:00 2001 From: Werner Date: Thu, 8 Jun 2023 15:49:53 -0300 Subject: [PATCH 1/2] Fix footer margin --- pages/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/index.js b/pages/index.js index 3b7a0b0..251f5a3 100644 --- a/pages/index.js +++ b/pages/index.js @@ -240,7 +240,7 @@ export default function Home() { -
+
Caio ArĂ¢es, David Freitas, Guilherme Werner
From d4ff3419db107d726c8ed96f44dd2c62af0738f5 Mon Sep 17 00:00:00 2001 From: Werner Date: Thu, 8 Jun 2023 16:45:05 -0300 Subject: [PATCH 2/2] Initial implementation --- pages/index.js | 594 +++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 555 insertions(+), 39 deletions(-) diff --git a/pages/index.js b/pages/index.js index 251f5a3..de7b4e8 100644 --- a/pages/index.js +++ b/pages/index.js @@ -11,28 +11,550 @@ import { useState } from 'react'; import Button from 'react-bootstrap/Button'; export default function Home() { - const [clock, setClock] = useState(0); - const [instructionStatus, setInstructionStatus] = useState([]); - const [reservationStations, setReservationStations] = useState([]); - const [registerStatus, setRegisterStatus] = useState([]); + let baseI = { + issue: null, + exeCompleta: null, + write: null, + busy: false, + } + + let instructions = [ + { + posicao: 0, + instrucao: { + operacao: "LD", + registradorR: "F6", + registradorS: "32", + registradorT: "R1", + }, + ...baseI, + }, + { + posicao: 1, + instrucao: { + operacao: "LD", + registradorR: "F2", + registradorS: "45", + registradorT: "R3", + }, + ...baseI, + }, + { + posicao: 2, + instrucao: { + operacao: "MULTD", + registradorR: "F0", + registradorS: "F2", + registradorT: "F4", + }, + ...baseI, + }, + { + posicao: 3, + instrucao: { + operacao: "SUBD", + registradorR: "F8", + registradorS: "F6", + registradorT: "F2", + }, + ...baseI, + }, + { + posicao: 4, + instrucao: { + operacao: "DIVD", + registradorR: "F10", + registradorS: "F0", + registradorT: "F6", + }, + ...baseI, + }, + { + posicao: 5, + instrucao: { + operacao: "ADDD", + registradorR: "F6", + registradorS: "F8", + registradorT: "F2", + }, + ...baseI, + } + ]; + + let baseFu = { + instrucao: null, + estadoInstrucao: null, + tempo: null, + ocupado: false, + operacao: null, + vj: null, + vk: null, + qj: null, + qk: null, + }; + + let fUnites = [ + { + tipoUnidade: "Integer", + nome: "Integer1", + ...baseFu + }, + { + tipoUnidade: "Integer", + nome: "Integer2", + ...baseFu + }, + { + tipoUnidade: "Integer", + nome: "Integer3", + ...baseFu + }, + { + tipoUnidade: "Add", + nome: "Add1", + ...baseFu + }, + { + tipoUnidade: "Add", + nome: "Add2", + ...baseFu + }, + { + tipoUnidade: "Add", + nome: "Add3", + ...baseFu + }, + { + tipoUnidade: "Mult", + nome: "Mult1", + ...baseFu + }, + { + tipoUnidade: "Mult", + nome: "Mult2", + ...baseFu + } + ]; + + let baseMu = { + instrucao: null, + estadoInstrucao: null, + tempo: null, + ocupado: false, + qi: null, + qj: null, + operacao: null, + endereco: null, + destino: null, + }; + + let mUnites = [ + { + tipoUnidade: "Load", + nome: "Load1", + ...baseMu + }, + { + tipoUnidade: "Load", + nome: "Load2", + ...baseMu + }, + { + tipoUnidade: "Load", + nome: "Load3", + ...baseMu + }, + { + tipoUnidade: "Load", + nome: "Load4", + ...baseMu + }, + { + tipoUnidade: "Load", + nome: "Load5", + ...baseMu + }, + { + tipoUnidade: "Store", + nome: "Store1", + ...baseMu + }, + { + tipoUnidade: "Store", + nome: "Store2", + ...baseMu + }, + { + tipoUnidade: "Store", + nome: "Store3", + ...baseMu + } + ]; + + let [clock, setClock] = useState(0); + let [instructionStatus, setInstructionStatus] = useState(instructions); + let [functionalUnits, setFunctionalUnits] = useState(fUnites); + let [memoryUnits, setMmoryUnits] = useState(mUnites); + let [registerStatus, setRegisterStatus] = useState([]); + + function fetchInstruction() { + for (let i = 0; i < instructionStatus.length; i++) { + let element = instructionStatus[i]; + + console.log("element:", element.instrucao.operacao); + + if (element.issue === null) { + return element; + } + } + + return undefined; + } + + function getFunctionalUnity(instr) { + console.log("getFunctionalUnity:", instr.operacao); + + switch (instr.operacao) { + case 'ADDD': + return 'Add' + case 'SUBD': + return 'Add' + case 'MULTD': + return 'Mult' + case 'DIVD': + return 'Mult' + case 'LD': + return 'Load' + case 'SD': + return 'Store' + case 'ADD': + return 'Integer' + case 'DADDUI': + return 'Integer' + case 'BEQ': + return 'Integer' + case 'BNEZ': + return 'Integer' + } + } + + function getEmptyFunctionalUnity(tipoFU) { + if ((tipoFU === 'Load') || (tipoFU === 'Store')) { + for (let key in memoryUnits) { + var ufMem = memoryUnits[key]; + + if (ufMem.tipoUnidade === tipoFU) { + if (!ufMem.ocupado) { + return ufMem; + } + } + } + + return undefined; + } + + for (let key in functionalUnits) { + var uf = functionalUnits[key]; + + if (uf.tipoUnidade === tipoFU) { + if (!uf.ocupado) { + return uf; + } + } + } + + return undefined; + } + + function getCycles(instrucao) { + switch (instrucao.operacao) { + case 'ADDD': + return 1; + case 'SUBD': + return 1; + case 'MULTD': + return 1; + case 'DIVD': + return 1; + case 'LD': + return 1; + case 'SD': + return 1; + case 'ADD': + return 1; + case 'DADDUI': + return 1; + case 'BEQ': + return 1; + case 'BNEZ': + return 1; + } + } + + function allocFunctionalUnit(uf, instrucao, estadoInstrucao) { + uf.instrucao = instrucao; + uf.estadoInstrucao = estadoInstrucao; + uf.tempo = getCycles(instrucao) + 1; + uf.ocupado = true; + uf.operacao = instrucao.operacao; + + let reg_j; + let reg_k; + let reg_j_inst; + let reg_k_inst; + + if ((instrucao.operacao === 'BNEZ') || (instrucao.operacao === 'BEQ')) { + reg_j = registerStatus[instrucao.registradorR]; + reg_k = registerStatus[instrucao.registradorS]; + reg_j_inst = instrucao.registradorR; + reg_k_inst = instrucao.registradorS; + } else { + reg_j = registerStatus[instrucao.registradorS]; + reg_k = registerStatus[instrucao.registradorT]; + reg_j_inst = instrucao.registradorS; + reg_k_inst = instrucao.registradorT; + } + + if (reg_j === null || reg_j === undefined) { + uf.vj = reg_j_inst; + } + else { + if ((reg_j in functionalUnits) || (reg_j in memoryUnits)) { + uf.qj = reg_j; + } + else { + uf.vj = reg_j; + } + } + + if (reg_k === null || reg_k === undefined) { + uf.vk = reg_k_inst; + } + else { + if ((reg_k in functionalUnits) || (reg_k in memoryUnits)) { + uf.qk = reg_k; + } + else { + uf.vk = reg_k; + } + } + } + + function allocMemoryUnit(uf, instrucao, estadoInstrucao) { + uf.instrucao = instrucao; + uf.estadoInstrucao = estadoInstrucao; + uf.tempo = getCycles(instrucao) + 1 + uf.ocupado = true; + uf.operacao = instrucao.operacao; + uf.endereco = instrucao.registradorS + '+' + instrucao.registradorT; + uf.destino = instrucao.registradorR; + uf.qi = null; + uf.qj = null; + + if (instrucao.operacao === 'SD') { + let UFQueTemQueEsperar = registerStatus[instrucao.registradorR]; + + if ((UFQueTemQueEsperar in functionalUnits) || (UFQueTemQueEsperar in memoryUnits)) { + uf.qi = UFQueTemQueEsperar; + } + else { + uf.qi = null; + } + } + + let UFintQueTemQueEsperar = registerStatus[instrucao.registradorT]; + + if ((UFintQueTemQueEsperar in functionalUnits) || (UFintQueTemQueEsperar in memoryUnits)) { + uf.qj = UFintQueTemQueEsperar; + } + else { + uf.qj = null; + } + } + + function writeRegister(instrucao, ufNome) { + registerStatus[instrucao.registradorR] = ufNome; + setRegisterStatus(registerStatus); + } + + function releaseWaitingUnity(UF) { + for (let keyUF in functionalUnits) { + const ufOlhando = functionalUnits[keyUF]; + + if ((ufOlhando.ocupado === true) && ((ufOlhando.qj === UF.nome) || (ufOlhando.qk === UF.nome))) { + if (ufOlhando.qj === UF.nome) { + ufOlhando.vj = 'VAL(' + UF.nome + ')'; + ufOlhando.qj = null; + } + + if (ufOlhando.qk === UF.nome) { + ufOlhando.vk = 'VAL(' + UF.nome + ')'; + ufOlhando.qk = null; + } + + if ((ufOlhando.qj === null) && (ufOlhando.qk === null)) { + ufOlhando.tempo = ufOlhando.tempo - 1; + } + } + } + + for (let keyUF in memoryUnits) { + const ufOlhando = memoryUnits[keyUF]; + + if (ufOlhando.ocupado === true) { + if (ufOlhando.qi === UF.nome) { + ufOlhando.qi = null; + ufOlhando.tempo = ufOlhando.tempo - 1; + } else if (ufOlhando.qj === UF.nome) { + ufOlhando.qj = null; + ufOlhando.tempo = ufOlhando.tempo - 1; + } + } + } + } + + function deallocFunctionalUnit(ufMem) { + ufMem.instrucao = null; + ufMem.estadoInstrucao = null; + ufMem.tempo = null; + ufMem.ocupado = false; + ufMem.operacao = null; + ufMem.endereco = null; + ufMem.destino = null; + ufMem.qi = null; + ufMem.qj = null; + } + + function deallocMemorylUnit(uf) { + uf.instrucao = null; + uf.estadoInstrucao = null; + uf.tempo = null; + uf.ocupado = false; + uf.operacao = null; + uf.vj = null; + uf.vk = null; + uf.qj = null; + uf.qk = null; + } function issueInstruction() { + console.log("issueInstruction"); + let novaInstrucao = fetchInstruction(); + + if (novaInstrucao) { + let ufInstrucao = getFunctionalUnity(novaInstrucao.instrucao); + let UFParaUsar = getEmptyFunctionalUnity(ufInstrucao); + + if (UFParaUsar) { + if ((UFParaUsar.tipoUnidade == 'Load') || (UFParaUsar.tipoUnidade == 'Store')) { + allocMemoryUnit(UFParaUsar, novaInstrucao.instrucao, novaInstrucao); + } + else { + allocFunctionalUnit(UFParaUsar, novaInstrucao.instrucao, novaInstrucao); + } + + novaInstrucao.issue = clock; + if ((UFParaUsar.tipoUnidade !== 'Store') && (UFParaUsar.operacao !== 'BEQ') && (UFParaUsar.operacao !== 'BEQ')) { + writeRegister(novaInstrucao.instrucao, UFParaUsar.nome); + } + } + } } function executeInstruction() { + for (let key in memoryUnits) { + var ufMem = memoryUnits[key]; + if ((ufMem.ocupado) && (ufMem.qi === null) && (ufMem.qj === null)) { + ufMem.tempo = ufMem.tempo - 1; + console.log("estado Instrucao", ufMem.estadoInstrucao); + + if (ufMem.tempo === 0) { + ufMem.estadoInstrucao.exeCompleta = clock; + ufMem.estadoInstrucao.busy = false; + } + } + } + + for (let key in functionalUnits) { + var uf = functionalUnits[key]; + + if ((uf.ocupado) && (uf.vj !== null) && (uf.vk !== null)) { + uf.tempo = uf.tempo - 1; + uf.estadoInstrucao.busy = true; + + if (uf.tempo === 0) { + uf.estadoInstrucao.exeCompleta = clock; + uf.estadoInstrucao.busy = false; + } + } + } } function writeInstruction() { + for (let key in memoryUnits) { + const ufMem = memoryUnits[key]; + if (ufMem.ocupado) { + if (ufMem.tempo === -1) { + ufMem.estadoInstrucao.write = clock; + + let valorReg = registerStatus[ufMem.instrucao.registradorR]; + + if (valorReg === ufMem.nome) { + registerStatus[ufMem.instrucao.registradorR] = 'VAL(' + ufMem.nome + ')'; + } + + releaseWaitingUnity(ufMem); + deallocMemorylUnit(ufMem); + } + } + } + + for (let key in functionalUnits) { + const uf = functionalUnits[key]; + + if (uf.ocupado && uf.tempo === -1) { + uf.estadoInstrucao.write = clock; + + let valorReg = registerStatus[uf.instrucao.registradorR]; + + if (valorReg === uf.nome) { + registerStatus[uf.instrucao.registradorR] = 'VAL(' + uf.nome + ')'; + } + + releaseWaitingUnity(uf); + deallocFunctionalUnit(uf); + } + } } function nextCycle() { setClock(clock + 1); + console.log(clock); issueInstruction(); executeInstruction(); writeInstruction(); + setInstructionStatus(instructionStatus); + setMmoryUnits(memoryUnits); + setFunctionalUnits(functionalUnits); + } + + function getFormatedState(instr) { + if (instr.write !== null) { + return "Commit"; + } + + if (instr.exeCompleta !== null) { + return "Write Result"; + } + + if (instr.issue !== null) { + return "Execute"; + } + + return "Issue"; } return ( @@ -81,10 +603,10 @@ export default function Home() { {instructionStatus.map((instr, index) => ( - batata - batata - batata - batata + {`${instr.instrucao.operacao} ${instr.instrucao.registradorR} ${instr.instrucao.registradorS} ${instr.instrucao.registradorT}`} + {instr.issue} + {instr.exeCompleta} + {instr.write} ))} @@ -108,12 +630,12 @@ export default function Home() { {instructionStatus.map((instr, index) => ( - batata - batata - batata - batata - batata - batata + {instr.posicao} + {instr.busy ? "Yes" : "No"} + {`${instr.instrucao.operacao} ${instr.instrucao.registradorR} ${instr.instrucao.registradorS} ${instr.instrucao.registradorT}`} + {getFormatedState(instr)} + {instr.instrucao.registradorR} + Mem[{instr.instrucao.registradorS} + {instr.instrucao.registradorT}] ))} @@ -130,26 +652,20 @@ export default function Home() { Time + Name Busy - Op - Vj - Vk - Qj - Qk - A + Address + Destination - {reservationStations.map((instr, index) => ( + {memoryUnits.map((unit, index) => ( - batata - batata - batata - batata - batata - batata - batata - batata + {unit.tempo} + {unit.nome} + {unit.ocupado ? "Yes" : "No"} + {unit.endereco} + {unit.destino} ))} @@ -162,6 +678,7 @@ export default function Home() { + @@ -169,20 +686,19 @@ export default function Home() { - - {reservationStations.map((instr, index) => ( + {functionalUnits.map((unit, index) => ( - - - - - - - - + + + + + + + + ))}
Time Name Busy OpVk Qj QkA
batatabatatabatatabatatabatatabatatabatatabatata{unit.tempo}{unit.nome}{unit.ocupado ? "Yes" : "No"}{unit.operacao}{unit.vj}{unit.vk}{unit.qj}{unit.qk}