From edbc13e0808e34899443f72525dc10162ed9b5e1 Mon Sep 17 00:00:00 2001 From: Werner Date: Thu, 8 Jun 2023 17:10:43 -0300 Subject: [PATCH] Update pages --- pages/build.js | 127 -------- pages/index.js | 793 +++++------------------------------------------- pages/runner.js | 766 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 849 insertions(+), 837 deletions(-) delete mode 100644 pages/build.js create mode 100644 pages/runner.js diff --git a/pages/build.js b/pages/build.js deleted file mode 100644 index f303940..0000000 --- a/pages/build.js +++ /dev/null @@ -1,127 +0,0 @@ -import Head from 'next/head' -import Form from 'react-bootstrap/Form'; -import Table from 'react-bootstrap/Table' -import { useState } from 'react'; -import { Container, Row, Col } from 'react-bootstrap'; - -export default function Home() { - const [instructionStatus, setInstructionStatus] = useState([]); - - const geraTabelaParaInserirInstrucoes = (nInst) => { - let tabela = []; - for (let i = 0; i < nInst; i++) { - let d = "D" + i; - let r = "R" + i; - let s = "S" + i; - let t = "T" + i; - tabela.push( - - - - - - - - - - - - - - - ); - } - return tabela; - }; - - const handleGenerateTable = (event) => { - const nInst = event.target.value; - setInstructionStatus(geraTabelaParaInserirInstrucoes(nInst)); - }; - - return ( - <> - - Tomasulo - - - - - -
- - -
-

Lista de Instruções

-
-
- - - - - - - - - - - - - - - - - - {instructionStatus} - -
InstruçãoOperando 3Operando 2Operando 1
- -
-
-
- - ) -} diff --git a/pages/index.js b/pages/index.js index de7b4e8..49d582a 100644 --- a/pages/index.js +++ b/pages/index.js @@ -1,562 +1,84 @@ import Head from 'next/head' -import Image from 'next/image' +import Form from 'react-bootstrap/Form'; import Table from 'react-bootstrap/Table' +import { useState } from 'react'; +import Image from 'next/image' import Container from 'react-bootstrap/Container' import Nav from 'react-bootstrap/Nav' import Navbar from 'react-bootstrap/Navbar'; import NavDropdown from 'react-bootstrap/NavDropdown' import Row from 'react-bootstrap/Row' import Col from 'react-bootstrap/Col' -import { useState } from 'react'; import Button from 'react-bootstrap/Button'; export default function Home() { - let baseI = { - issue: null, - exeCompleta: null, - write: null, - busy: false, - } + const [instructionStatus, setInstructionStatus] = useState([]); - 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, + const geraTabelaParaInserirInstrucoes = (nInst) => { + let tabela = []; + for (let i = 0; i < nInst; i++) { + let d = "D" + i; + let r = "R" + i; + let s = "S" + i; + let t = "T" + i; + tabela.push( + + + + + + + + + + + + + + + ); } - ]; - - let baseFu = { - instrucao: null, - estadoInstrucao: null, - tempo: null, - ocupado: false, - operacao: null, - vj: null, - vk: null, - qj: null, - qk: null, + return tabela; }; - 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, + const handleGenerateTable = (event) => { + const nInst = event.target.value; + setInstructionStatus(geraTabelaParaInserirInstrucoes(nInst)); }; - 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 ( <> @@ -578,187 +100,38 @@ export default function Home() {
- + +
+

Lista de Instruções

+
+
+ -

Ciclos: {clock}

- - - +
- + -
-

Instruction Status

-
- +
- - - - + + + + - {instructionStatus.map((instr, index) => ( - - - - - - - ))} - -
InstructionIssuedExecuteWrite ResultInstruçãoOperando 3Operando 2Operando 1
{`${instr.instrucao.operacao} ${instr.instrucao.registradorR} ${instr.instrucao.registradorS} ${instr.instrucao.registradorT}`}{instr.issue}{instr.exeCompleta}{instr.write}
- - -
-

Reorder Buffer

-
- - - - - - - - - - - - - {instructionStatus.map((instr, index) => ( - - - - - - - - - ))} + {instructionStatus}
EntryBusyInstructionStateDestinationValue
{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}]
- - - -
-

Reservation Stations (Load/Store)

-
- - - - - - - - - - - - {memoryUnits.map((unit, index) => ( - - - - - - - - ))} - -
TimeNameBusyAddressDestination
{unit.tempo}{unit.nome}{unit.ocupado ? "Yes" : "No"}{unit.endereco}{unit.destino}
- - -
-

Reservation Stations

-
- - - - - - - - - - - - - - - {functionalUnits.map((unit, index) => ( - - - - - - - - - - - ))} - -
TimeNameBusyOpVjVkQjQk
{unit.tempo}{unit.nome}{unit.ocupado ? "Yes" : "No"}{unit.operacao}{unit.vj}{unit.vk}{unit.qj}{unit.qk}
- -
-
-

Registers Status

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldF0F1F2F3F4F5F6F7F8F9F10
Reorder #
Busy
-
- Caio Arâes, David Freitas, Guilherme Werner -
diff --git a/pages/runner.js b/pages/runner.js new file mode 100644 index 0000000..de7b4e8 --- /dev/null +++ b/pages/runner.js @@ -0,0 +1,766 @@ +import Head from 'next/head' +import Image from 'next/image' +import Table from 'react-bootstrap/Table' +import Container from 'react-bootstrap/Container' +import Nav from 'react-bootstrap/Nav' +import Navbar from 'react-bootstrap/Navbar'; +import NavDropdown from 'react-bootstrap/NavDropdown' +import Row from 'react-bootstrap/Row' +import Col from 'react-bootstrap/Col' +import { useState } from 'react'; +import Button from 'react-bootstrap/Button'; + +export default function Home() { + 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 ( + <> + + Tomasulo + + + + + + + + Tomasulo + + +
+ + + +

Ciclos: {clock}

+ + + + +
+ + +
+

Instruction Status

+
+ + + + + + + + + + + {instructionStatus.map((instr, index) => ( + + + + + + + ))} + +
InstructionIssuedExecuteWrite Result
{`${instr.instrucao.operacao} ${instr.instrucao.registradorR} ${instr.instrucao.registradorS} ${instr.instrucao.registradorT}`}{instr.issue}{instr.exeCompleta}{instr.write}
+ + +
+

Reorder Buffer

+
+ + + + + + + + + + + + + {instructionStatus.map((instr, index) => ( + + + + + + + + + ))} + +
EntryBusyInstructionStateDestinationValue
{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}]
+ +
+ + + +
+

Reservation Stations (Load/Store)

+
+ + + + + + + + + + + + {memoryUnits.map((unit, index) => ( + + + + + + + + ))} + +
TimeNameBusyAddressDestination
{unit.tempo}{unit.nome}{unit.ocupado ? "Yes" : "No"}{unit.endereco}{unit.destino}
+ + +
+

Reservation Stations

+
+ + + + + + + + + + + + + + + {functionalUnits.map((unit, index) => ( + + + + + + + + + + + ))} + +
TimeNameBusyOpVjVkQjQk
{unit.tempo}{unit.nome}{unit.ocupado ? "Yes" : "No"}{unit.operacao}{unit.vj}{unit.vk}{unit.qj}{unit.qk}
+ +
+
+

Registers Status

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldF0F1F2F3F4F5F6F7F8F9F10
Reorder #
Busy
+
+ Caio Arâes, David Freitas, Guilherme Werner +
+
+
+ + ) +}