├── docs ├── README.md ├── _book │ ├── README.md │ ├── SUMMARY.md │ ├── en │ │ ├── imgs │ │ │ ├── bm9.png │ │ │ ├── bm19.png │ │ │ ├── bm40.png │ │ │ ├── bm41.png │ │ │ ├── bm0_result.png │ │ │ ├── bm1_result.png │ │ │ ├── bm2_result.png │ │ │ ├── bm3_result.png │ │ │ ├── bm4_result.png │ │ │ ├── bm5_result.png │ │ │ ├── bm6_result.png │ │ │ ├── bm7_result.png │ │ │ ├── bm8_result.png │ │ │ ├── bm10_result.png │ │ │ ├── bm11_result.png │ │ │ ├── bm12_result.png │ │ │ ├── bm13_result.png │ │ │ ├── bm14_result.png │ │ │ ├── bm15_result.png │ │ │ ├── bm16_result.png │ │ │ ├── bm17_result.png │ │ │ ├── bm18_result.png │ │ │ ├── bm20_result.png │ │ │ ├── bm21_result.png │ │ │ ├── bm22_result.png │ │ │ ├── bm23_result.png │ │ │ ├── bm24_result.png │ │ │ ├── bm25_result.png │ │ │ ├── bm26_result.png │ │ │ ├── bm27_result.png │ │ │ ├── bm28_result.png │ │ │ ├── bm29_result.png │ │ │ ├── bm30_result.png │ │ │ ├── bm31_result.png │ │ │ ├── bm32_result.png │ │ │ ├── bm33_result.png │ │ │ ├── bm34_result.png │ │ │ ├── bm35_result.png │ │ │ ├── bm36_result.png │ │ │ ├── bm37_result.png │ │ │ ├── bm38_result.png │ │ │ ├── bm39_result.png │ │ │ ├── bm42_result.png │ │ │ ├── bm43_result.png │ │ │ └── bm44_result.png │ │ └── installation.md │ └── gitbook │ │ ├── images │ │ ├── favicon.ico │ │ └── apple-touch-icon-precomposed-152.png │ │ ├── fonts │ │ └── fontawesome │ │ │ ├── FontAwesome.otf │ │ │ ├── fontawesome-webfont.eot │ │ │ ├── fontawesome-webfont.ttf │ │ │ ├── fontawesome-webfont.woff │ │ │ └── fontawesome-webfont.woff2 │ │ ├── gitbook-plugin-livereload │ │ └── plugin.js │ │ ├── gitbook-plugin-search │ │ ├── search.css │ │ └── search-engine.js │ │ └── gitbook-plugin-lunr │ │ └── search-lunr.js ├── LANGS.md ├── SUMMARY.md ├── en │ ├── book.json │ ├── imgs │ │ ├── bm19.png │ │ ├── bm40.png │ │ ├── bm41.png │ │ ├── bm9.png │ │ ├── bm0_result.png │ │ ├── bm10_result.png │ │ ├── bm11_result.png │ │ ├── bm12_result.png │ │ ├── bm13_result.png │ │ ├── bm14_result.png │ │ ├── bm15_result.png │ │ ├── bm16_result.png │ │ ├── bm17_result.png │ │ ├── bm18_result.png │ │ ├── bm1_result.png │ │ ├── bm20_result.png │ │ ├── bm21_result.png │ │ ├── bm22_result.png │ │ ├── bm23_result.png │ │ ├── bm24_result.png │ │ ├── bm25_result.png │ │ ├── bm26_result.png │ │ ├── bm27_result.png │ │ ├── bm28_result.png │ │ ├── bm29_result.png │ │ ├── bm2_result.png │ │ ├── bm30_result.png │ │ ├── bm31_result.png │ │ ├── bm32_result.png │ │ ├── bm33_result.png │ │ ├── bm34_result.png │ │ ├── bm35_result.png │ │ ├── bm36_result.png │ │ ├── bm37_result.png │ │ ├── bm38_result.png │ │ ├── bm39_result.png │ │ ├── bm3_result.png │ │ ├── bm42_result.png │ │ ├── bm43_result.png │ │ ├── bm44_result.png │ │ ├── bm4_result.png │ │ ├── bm5_result.png │ │ ├── bm6_result.png │ │ ├── bm7_result.png │ │ └── bm8_result.png │ ├── installation.md │ ├── historial.md │ ├── menu-archivo.md │ ├── bloques-basicos.md │ ├── rob-registros.md │ ├── nat-gpr-fpr.md │ ├── calculo-de-direcciones.md │ ├── crear-codigo-vliw.md │ ├── decodificador.md │ ├── unidad-de-prebusqueda.md │ ├── cargar-codigo-vliw.md │ ├── configurar-parametros-vliw.md │ ├── menu-ventana.md │ ├── desenrollado-de-bucles.md │ ├── configurar-instrucciones-vliw.md │ ├── tabla-de-prediccion-de-salto.md │ ├── configurar-parametros-superescalar.md │ ├── autor.md │ ├── menu-ayuda.md │ ├── registros-de-punto-flotante.md │ ├── registro-predicado.md │ ├── memoria.md │ ├── registros-de-proposito-general.md │ ├── modos-de-direccionamiento.md │ ├── menu-ver.md │ ├── software-pipelining.md │ ├── reorder-buffer.md │ ├── predicacion-operaciones.md │ ├── ejemplo-de-codigo-secuencial.md │ ├── estructura-comun.md │ ├── instruction-level-paralelism.md │ ├── maquina-superescalar.md │ ├── estaciones-de-reserva.md │ ├── maquina-vliw.md │ ├── menu-ejecutar.md │ ├── ventana-de-instrucciones.md │ ├── unidades-funcionales.md │ ├── ventana-registros-memoria.md │ ├── fichero-de-codigo-secuencial.md │ ├── menu-configurar.md │ └── barra-de-herramientas-estandar.md └── es │ ├── imgs │ ├── bm19.png │ ├── bm40.png │ ├── bm41.png │ ├── bm9.png │ ├── bm0_result.png │ ├── bm10_result.png │ ├── bm11_result.png │ ├── bm12_result.png │ ├── bm13_result.png │ ├── bm14_result.png │ ├── bm15_result.png │ ├── bm16_result.png │ ├── bm17_result.png │ ├── bm18_result.png │ ├── bm1_result.png │ ├── bm20_result.png │ ├── bm21_result.png │ ├── bm22_result.png │ ├── bm23_result.png │ ├── bm24_result.png │ ├── bm25_result.png │ ├── bm26_result.png │ ├── bm27_result.png │ ├── bm28_result.png │ ├── bm29_result.png │ ├── bm2_result.png │ ├── bm30_result.png │ ├── bm31_result.png │ ├── bm32_result.png │ ├── bm33_result.png │ ├── bm34_result.png │ ├── bm35_result.png │ ├── bm36_result.png │ ├── bm37_result.png │ ├── bm38_result.png │ ├── bm39_result.png │ ├── bm3_result.png │ ├── bm42_result.png │ ├── bm43_result.png │ ├── bm44_result.png │ ├── bm4_result.png │ ├── bm5_result.png │ ├── bm6_result.png │ ├── bm7_result.png │ └── bm8_result.png │ ├── book.json │ ├── installation.md │ ├── menu-archivo.md │ ├── historial.md │ ├── bloques-basicos.md │ ├── nat-gpr-fpr.md │ ├── rob-registros.md │ ├── calculo-de-direcciones.md │ ├── autor.md │ ├── cargar-codigo-vliw.md │ ├── decodificador.md │ ├── crear-codigo-vliw.md │ ├── configurar-instrucciones-vliw.md │ ├── unidad-de-prebusqueda.md │ ├── menu-ventana.md │ ├── configurar-parametros-vliw.md │ ├── menu-ayuda.md │ ├── configurar-parametros-superescalar.md │ ├── registros-de-punto-flotante.md │ ├── registros-de-proposito-general.md │ ├── registro-predicado.md │ ├── tabla-de-prediccion-de-salto.md │ ├── menu-ver.md │ ├── reorder-buffer.md │ ├── modos-de-direccionamiento.md │ ├── memoria.md │ ├── predicacion-operaciones.md │ ├── desenrollado-de-bucles.md │ ├── software-pipelining.md │ ├── ejemplo-de-codigo-secuencial.md │ ├── menu-ejecutar.md │ ├── estructura-comun.md │ ├── estaciones-de-reserva.md │ ├── barra-de-herramientas-estandar.md │ ├── maquina-vliw.md │ ├── menu-configurar.md │ ├── instruction-level-paralelism.md │ ├── barra-de-herramientas-de-ejecucion.md │ ├── maquina-superescalar.md │ ├── ventana-de-instrucciones.md │ ├── unidades-funcionales.md │ ├── fichero-de-codigo-secuencial.md │ ├── ventana-registros-memoria.md │ └── juego-de-instrucciones.md ├── .envrc ├── public └── locales │ └── en-US ├── src ├── interface │ ├── actions │ │ ├── tabs.ts │ │ ├── batch.ts │ │ ├── load.ts │ │ ├── memory-actions.ts │ │ ├── basic-blocks-actions.ts │ │ ├── jump-table-actions.ts │ │ ├── register-actions.ts │ │ ├── reorder-buffer-mapper-actions.ts │ │ ├── cycle-actions.ts │ │ ├── prefetch-decoder-actions.ts │ │ ├── history.ts │ │ ├── index.ts │ │ ├── reorder-buffer-actions.ts │ │ ├── stats-actions.ts │ │ ├── intervals-actions.ts │ │ ├── reserve-station-actions.ts │ │ ├── functional-unit-actions.ts │ │ └── predicate-nat-actions.ts │ ├── reducers │ │ ├── vliw.ts │ │ ├── batching.ts │ │ ├── color.ts │ │ ├── index.ts │ │ └── interval.ts │ ├── styles │ │ ├── base │ │ │ ├── main.scss │ │ │ └── variables.scss │ │ ├── components │ │ │ ├── App.scss │ │ │ ├── IntervalModalComponent.scss │ │ │ ├── PrefetchDecoderComponent.scss │ │ │ ├── Forms.scss │ │ │ ├── BatchResultsComponent.scss │ │ │ ├── FunctionalUnitComponent.scss │ │ │ ├── RegisterComponent.scss │ │ │ ├── ROBMapperComponent.scss │ │ │ ├── JumpPredictionComponent.scss │ │ │ ├── RegistersTabComponent.scss │ │ │ ├── ReorderBufferComponent.scss │ │ │ ├── ReserveStationComponent.scss │ │ │ ├── SuperscalarConfigModalComponent.scss │ │ │ ├── Tabs.scss │ │ │ ├── FileBarComponent.scss │ │ │ ├── AccessBarComponent.scss │ │ │ ├── LoadModalComponent.scss │ │ │ ├── LoadContentModalComponent.scss │ │ │ ├── main.scss │ │ │ ├── Panel.scss │ │ │ ├── Table.scss │ │ │ ├── CodeComponent.scss │ │ │ └── GeneralTabComponent.scss │ │ ├── utils │ │ │ └── main.scss │ │ ├── vendor │ │ │ ├── main.scss │ │ │ └── _bootstrap.scss │ │ ├── main.scss │ │ └── projectpage │ │ │ └── main.scss │ ├── utils │ │ ├── Downloader.ts │ │ ├── constants.ts │ │ └── interval.ts │ ├── components │ │ ├── VLIW │ │ │ ├── VLIWOperationComponent.tsx │ │ │ └── InstructionComponent.tsx │ │ ├── Superscalar │ │ │ ├── PrefetchDecoderComponent.tsx │ │ │ ├── ROBMapperComponent.tsx │ │ │ └── JumpPredictionComponent.tsx │ │ ├── Common │ │ │ └── FileReaderInput_LICENSE.txt │ │ └── LandingPage │ │ │ └── ProjectPageComponent.tsx │ └── App.tsx ├── vite-env.d.ts ├── integration │ ├── utils.ts │ └── machine-integration.ts ├── core │ ├── Utils │ │ └── Random.ts │ ├── VLIW │ │ ├── VLIWError.ts │ │ └── LargeInstructions.ts │ ├── Common │ │ ├── InstructionFormats.ts │ │ └── Memory.ts │ └── Superscalar │ │ ├── SuperscalarEnums.ts │ │ ├── PrefetchUnit.ts │ │ └── JumpPredictor.ts ├── test │ ├── functional │ │ ├── code │ │ │ ├── r0inmutable.ts │ │ │ ├── nuevaOp.ts │ │ │ ├── speculativenosideeffects.ts │ │ │ ├── despl.ts │ │ │ ├── bucleint.ts │ │ │ ├── multiwayvliw1.ts │ │ │ ├── bucle2.ts │ │ │ ├── bucle.ts │ │ │ ├── bucledoble.ts │ │ │ ├── buclesoft.ts │ │ │ ├── bucle3.ts │ │ │ ├── nobucle.ts │ │ │ ├── buclesoft2.ts │ │ │ ├── recorrelista.ts │ │ │ └── bucle4.ts │ │ ├── Superscalar │ │ │ ├── r0inmutable.spec.ts │ │ │ ├── shift.spec.ts │ │ │ ├── newop.spec.ts │ │ │ ├── speculativenosideeffects.spec.ts │ │ │ └── rawdependency.spec.ts │ │ └── VLIW │ │ │ └── shift.spec.ts │ └── unit │ │ └── core │ │ └── Common │ │ └── Instruction.spec.ts ├── store.ts ├── main.scss ├── main.tsx └── i18n.ts ├── stylelint.config.js ├── book.json ├── .gitignore ├── biome.json ├── vite.config.ts ├── .github ├── renovate.json └── workflows │ ├── release-please.yml │ ├── review.yml │ ├── deploy.yml │ ├── build.yml │ └── deploy-pages.yml ├── index.html ├── CONTRIBUTING.md ├── tsconfig.json ├── CITATION.cff └── .all-contributorsrc /docs/README.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.envrc: -------------------------------------------------------------------------------- 1 | use flake 2 | -------------------------------------------------------------------------------- /docs/_book/README.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/locales/en-US: -------------------------------------------------------------------------------- 1 | en -------------------------------------------------------------------------------- /src/interface/actions/tabs.ts: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/interface/reducers/vliw.ts: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/interface/styles/base/main.scss: -------------------------------------------------------------------------------- 1 | @import './variables'; 2 | -------------------------------------------------------------------------------- /src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /docs/LANGS.md: -------------------------------------------------------------------------------- 1 | # Languages 2 | 3 | * [English](en/) 4 | * [Español](es/) -------------------------------------------------------------------------------- /docs/SUMMARY.md: -------------------------------------------------------------------------------- 1 | # Summary 2 | 3 | * [Introduction](README.md) 4 | 5 | -------------------------------------------------------------------------------- /docs/_book/SUMMARY.md: -------------------------------------------------------------------------------- 1 | # Summary 2 | 3 | * [Introduction](README.md) 4 | 5 | -------------------------------------------------------------------------------- /src/interface/styles/components/App.scss: -------------------------------------------------------------------------------- 1 | .smd { 2 | height: 100vh; 3 | } 4 | -------------------------------------------------------------------------------- /stylelint.config.js: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "stylelint-config-standard-scss" 3 | } 4 | -------------------------------------------------------------------------------- /docs/en/book.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "SIMDE Documentation", 3 | "root": "./" 4 | } -------------------------------------------------------------------------------- /docs/en/imgs/bm19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/en/imgs/bm19.png -------------------------------------------------------------------------------- /docs/en/imgs/bm40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/en/imgs/bm40.png -------------------------------------------------------------------------------- /docs/en/imgs/bm41.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/en/imgs/bm41.png -------------------------------------------------------------------------------- /docs/en/imgs/bm9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/en/imgs/bm9.png -------------------------------------------------------------------------------- /docs/es/imgs/bm19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/es/imgs/bm19.png -------------------------------------------------------------------------------- /docs/es/imgs/bm40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/es/imgs/bm40.png -------------------------------------------------------------------------------- /docs/es/imgs/bm41.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/es/imgs/bm41.png -------------------------------------------------------------------------------- /docs/es/imgs/bm9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/es/imgs/bm9.png -------------------------------------------------------------------------------- /docs/_book/en/imgs/bm9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/_book/en/imgs/bm9.png -------------------------------------------------------------------------------- /docs/_book/en/imgs/bm19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/_book/en/imgs/bm19.png -------------------------------------------------------------------------------- /docs/_book/en/imgs/bm40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/_book/en/imgs/bm40.png -------------------------------------------------------------------------------- /docs/_book/en/imgs/bm41.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/_book/en/imgs/bm41.png -------------------------------------------------------------------------------- /docs/en/imgs/bm0_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/en/imgs/bm0_result.png -------------------------------------------------------------------------------- /docs/en/imgs/bm10_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/en/imgs/bm10_result.png -------------------------------------------------------------------------------- /docs/en/imgs/bm11_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/en/imgs/bm11_result.png -------------------------------------------------------------------------------- /docs/en/imgs/bm12_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/en/imgs/bm12_result.png -------------------------------------------------------------------------------- /docs/en/imgs/bm13_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/en/imgs/bm13_result.png -------------------------------------------------------------------------------- /docs/en/imgs/bm14_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/en/imgs/bm14_result.png -------------------------------------------------------------------------------- /docs/en/imgs/bm15_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/en/imgs/bm15_result.png -------------------------------------------------------------------------------- /docs/en/imgs/bm16_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/en/imgs/bm16_result.png -------------------------------------------------------------------------------- /docs/en/imgs/bm17_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/en/imgs/bm17_result.png -------------------------------------------------------------------------------- /docs/en/imgs/bm18_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/en/imgs/bm18_result.png -------------------------------------------------------------------------------- /docs/en/imgs/bm1_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/en/imgs/bm1_result.png -------------------------------------------------------------------------------- /docs/en/imgs/bm20_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/en/imgs/bm20_result.png -------------------------------------------------------------------------------- /docs/en/imgs/bm21_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/en/imgs/bm21_result.png -------------------------------------------------------------------------------- /docs/en/imgs/bm22_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/en/imgs/bm22_result.png -------------------------------------------------------------------------------- /docs/en/imgs/bm23_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/en/imgs/bm23_result.png -------------------------------------------------------------------------------- /docs/en/imgs/bm24_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/en/imgs/bm24_result.png -------------------------------------------------------------------------------- /docs/en/imgs/bm25_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/en/imgs/bm25_result.png -------------------------------------------------------------------------------- /docs/en/imgs/bm26_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/en/imgs/bm26_result.png -------------------------------------------------------------------------------- /docs/en/imgs/bm27_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/en/imgs/bm27_result.png -------------------------------------------------------------------------------- /docs/en/imgs/bm28_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/en/imgs/bm28_result.png -------------------------------------------------------------------------------- /docs/en/imgs/bm29_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/en/imgs/bm29_result.png -------------------------------------------------------------------------------- /docs/en/imgs/bm2_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/en/imgs/bm2_result.png -------------------------------------------------------------------------------- /docs/en/imgs/bm30_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/en/imgs/bm30_result.png -------------------------------------------------------------------------------- /docs/en/imgs/bm31_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/en/imgs/bm31_result.png -------------------------------------------------------------------------------- /docs/en/imgs/bm32_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/en/imgs/bm32_result.png -------------------------------------------------------------------------------- /docs/en/imgs/bm33_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/en/imgs/bm33_result.png -------------------------------------------------------------------------------- /docs/en/imgs/bm34_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/en/imgs/bm34_result.png -------------------------------------------------------------------------------- /docs/en/imgs/bm35_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/en/imgs/bm35_result.png -------------------------------------------------------------------------------- /docs/en/imgs/bm36_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/en/imgs/bm36_result.png -------------------------------------------------------------------------------- /docs/en/imgs/bm37_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/en/imgs/bm37_result.png -------------------------------------------------------------------------------- /docs/en/imgs/bm38_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/en/imgs/bm38_result.png -------------------------------------------------------------------------------- /docs/en/imgs/bm39_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/en/imgs/bm39_result.png -------------------------------------------------------------------------------- /docs/en/imgs/bm3_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/en/imgs/bm3_result.png -------------------------------------------------------------------------------- /docs/en/imgs/bm42_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/en/imgs/bm42_result.png -------------------------------------------------------------------------------- /docs/en/imgs/bm43_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/en/imgs/bm43_result.png -------------------------------------------------------------------------------- /docs/en/imgs/bm44_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/en/imgs/bm44_result.png -------------------------------------------------------------------------------- /docs/en/imgs/bm4_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/en/imgs/bm4_result.png -------------------------------------------------------------------------------- /docs/en/imgs/bm5_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/en/imgs/bm5_result.png -------------------------------------------------------------------------------- /docs/en/imgs/bm6_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/en/imgs/bm6_result.png -------------------------------------------------------------------------------- /docs/en/imgs/bm7_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/en/imgs/bm7_result.png -------------------------------------------------------------------------------- /docs/en/imgs/bm8_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/en/imgs/bm8_result.png -------------------------------------------------------------------------------- /docs/es/imgs/bm0_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/es/imgs/bm0_result.png -------------------------------------------------------------------------------- /docs/es/imgs/bm10_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/es/imgs/bm10_result.png -------------------------------------------------------------------------------- /docs/es/imgs/bm11_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/es/imgs/bm11_result.png -------------------------------------------------------------------------------- /docs/es/imgs/bm12_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/es/imgs/bm12_result.png -------------------------------------------------------------------------------- /docs/es/imgs/bm13_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/es/imgs/bm13_result.png -------------------------------------------------------------------------------- /docs/es/imgs/bm14_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/es/imgs/bm14_result.png -------------------------------------------------------------------------------- /docs/es/imgs/bm15_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/es/imgs/bm15_result.png -------------------------------------------------------------------------------- /docs/es/imgs/bm16_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/es/imgs/bm16_result.png -------------------------------------------------------------------------------- /docs/es/imgs/bm17_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/es/imgs/bm17_result.png -------------------------------------------------------------------------------- /docs/es/imgs/bm18_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/es/imgs/bm18_result.png -------------------------------------------------------------------------------- /docs/es/imgs/bm1_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/es/imgs/bm1_result.png -------------------------------------------------------------------------------- /docs/es/imgs/bm20_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/es/imgs/bm20_result.png -------------------------------------------------------------------------------- /docs/es/imgs/bm21_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/es/imgs/bm21_result.png -------------------------------------------------------------------------------- /docs/es/imgs/bm22_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/es/imgs/bm22_result.png -------------------------------------------------------------------------------- /docs/es/imgs/bm23_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/es/imgs/bm23_result.png -------------------------------------------------------------------------------- /docs/es/imgs/bm24_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/es/imgs/bm24_result.png -------------------------------------------------------------------------------- /docs/es/imgs/bm25_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/es/imgs/bm25_result.png -------------------------------------------------------------------------------- /docs/es/imgs/bm26_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/es/imgs/bm26_result.png -------------------------------------------------------------------------------- /docs/es/imgs/bm27_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/es/imgs/bm27_result.png -------------------------------------------------------------------------------- /docs/es/imgs/bm28_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/es/imgs/bm28_result.png -------------------------------------------------------------------------------- /docs/es/imgs/bm29_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/es/imgs/bm29_result.png -------------------------------------------------------------------------------- /docs/es/imgs/bm2_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/es/imgs/bm2_result.png -------------------------------------------------------------------------------- /docs/es/imgs/bm30_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/es/imgs/bm30_result.png -------------------------------------------------------------------------------- /docs/es/imgs/bm31_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/es/imgs/bm31_result.png -------------------------------------------------------------------------------- /docs/es/imgs/bm32_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/es/imgs/bm32_result.png -------------------------------------------------------------------------------- /docs/es/imgs/bm33_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/es/imgs/bm33_result.png -------------------------------------------------------------------------------- /docs/es/imgs/bm34_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/es/imgs/bm34_result.png -------------------------------------------------------------------------------- /docs/es/imgs/bm35_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/es/imgs/bm35_result.png -------------------------------------------------------------------------------- /docs/es/imgs/bm36_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/es/imgs/bm36_result.png -------------------------------------------------------------------------------- /docs/es/imgs/bm37_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/es/imgs/bm37_result.png -------------------------------------------------------------------------------- /docs/es/imgs/bm38_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/es/imgs/bm38_result.png -------------------------------------------------------------------------------- /docs/es/imgs/bm39_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/es/imgs/bm39_result.png -------------------------------------------------------------------------------- /docs/es/imgs/bm3_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/es/imgs/bm3_result.png -------------------------------------------------------------------------------- /docs/es/imgs/bm42_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/es/imgs/bm42_result.png -------------------------------------------------------------------------------- /docs/es/imgs/bm43_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/es/imgs/bm43_result.png -------------------------------------------------------------------------------- /docs/es/imgs/bm44_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/es/imgs/bm44_result.png -------------------------------------------------------------------------------- /docs/es/imgs/bm4_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/es/imgs/bm4_result.png -------------------------------------------------------------------------------- /docs/es/imgs/bm5_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/es/imgs/bm5_result.png -------------------------------------------------------------------------------- /docs/es/imgs/bm6_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/es/imgs/bm6_result.png -------------------------------------------------------------------------------- /docs/es/imgs/bm7_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/es/imgs/bm7_result.png -------------------------------------------------------------------------------- /docs/es/imgs/bm8_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/es/imgs/bm8_result.png -------------------------------------------------------------------------------- /src/integration/utils.ts: -------------------------------------------------------------------------------- 1 | export enum ExecutionStatus { 2 | EXECUTABLE, 3 | PAUSE, 4 | STOP 5 | } -------------------------------------------------------------------------------- /book.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "SIMDE Official Docs", 3 | "root": "./docs", 4 | "plugins": [ "ace"] 5 | } -------------------------------------------------------------------------------- /docs/es/book.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "SIMDE Documentation", 3 | "root": "./", 4 | "language": "es" 5 | } -------------------------------------------------------------------------------- /docs/_book/en/imgs/bm0_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/_book/en/imgs/bm0_result.png -------------------------------------------------------------------------------- /docs/_book/en/imgs/bm1_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/_book/en/imgs/bm1_result.png -------------------------------------------------------------------------------- /docs/_book/en/imgs/bm2_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/_book/en/imgs/bm2_result.png -------------------------------------------------------------------------------- /docs/_book/en/imgs/bm3_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/_book/en/imgs/bm3_result.png -------------------------------------------------------------------------------- /docs/_book/en/imgs/bm4_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/_book/en/imgs/bm4_result.png -------------------------------------------------------------------------------- /docs/_book/en/imgs/bm5_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/_book/en/imgs/bm5_result.png -------------------------------------------------------------------------------- /docs/_book/en/imgs/bm6_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/_book/en/imgs/bm6_result.png -------------------------------------------------------------------------------- /docs/_book/en/imgs/bm7_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/_book/en/imgs/bm7_result.png -------------------------------------------------------------------------------- /docs/_book/en/imgs/bm8_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/_book/en/imgs/bm8_result.png -------------------------------------------------------------------------------- /docs/_book/en/imgs/bm10_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/_book/en/imgs/bm10_result.png -------------------------------------------------------------------------------- /docs/_book/en/imgs/bm11_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/_book/en/imgs/bm11_result.png -------------------------------------------------------------------------------- /docs/_book/en/imgs/bm12_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/_book/en/imgs/bm12_result.png -------------------------------------------------------------------------------- /docs/_book/en/imgs/bm13_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/_book/en/imgs/bm13_result.png -------------------------------------------------------------------------------- /docs/_book/en/imgs/bm14_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/_book/en/imgs/bm14_result.png -------------------------------------------------------------------------------- /docs/_book/en/imgs/bm15_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/_book/en/imgs/bm15_result.png -------------------------------------------------------------------------------- /docs/_book/en/imgs/bm16_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/_book/en/imgs/bm16_result.png -------------------------------------------------------------------------------- /docs/_book/en/imgs/bm17_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/_book/en/imgs/bm17_result.png -------------------------------------------------------------------------------- /docs/_book/en/imgs/bm18_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/_book/en/imgs/bm18_result.png -------------------------------------------------------------------------------- /docs/_book/en/imgs/bm20_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/_book/en/imgs/bm20_result.png -------------------------------------------------------------------------------- /docs/_book/en/imgs/bm21_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/_book/en/imgs/bm21_result.png -------------------------------------------------------------------------------- /docs/_book/en/imgs/bm22_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/_book/en/imgs/bm22_result.png -------------------------------------------------------------------------------- /docs/_book/en/imgs/bm23_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/_book/en/imgs/bm23_result.png -------------------------------------------------------------------------------- /docs/_book/en/imgs/bm24_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/_book/en/imgs/bm24_result.png -------------------------------------------------------------------------------- /docs/_book/en/imgs/bm25_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/_book/en/imgs/bm25_result.png -------------------------------------------------------------------------------- /docs/_book/en/imgs/bm26_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/_book/en/imgs/bm26_result.png -------------------------------------------------------------------------------- /docs/_book/en/imgs/bm27_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/_book/en/imgs/bm27_result.png -------------------------------------------------------------------------------- /docs/_book/en/imgs/bm28_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/_book/en/imgs/bm28_result.png -------------------------------------------------------------------------------- /docs/_book/en/imgs/bm29_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/_book/en/imgs/bm29_result.png -------------------------------------------------------------------------------- /docs/_book/en/imgs/bm30_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/_book/en/imgs/bm30_result.png -------------------------------------------------------------------------------- /docs/_book/en/imgs/bm31_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/_book/en/imgs/bm31_result.png -------------------------------------------------------------------------------- /docs/_book/en/imgs/bm32_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/_book/en/imgs/bm32_result.png -------------------------------------------------------------------------------- /docs/_book/en/imgs/bm33_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/_book/en/imgs/bm33_result.png -------------------------------------------------------------------------------- /docs/_book/en/imgs/bm34_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/_book/en/imgs/bm34_result.png -------------------------------------------------------------------------------- /docs/_book/en/imgs/bm35_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/_book/en/imgs/bm35_result.png -------------------------------------------------------------------------------- /docs/_book/en/imgs/bm36_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/_book/en/imgs/bm36_result.png -------------------------------------------------------------------------------- /docs/_book/en/imgs/bm37_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/_book/en/imgs/bm37_result.png -------------------------------------------------------------------------------- /docs/_book/en/imgs/bm38_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/_book/en/imgs/bm38_result.png -------------------------------------------------------------------------------- /docs/_book/en/imgs/bm39_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/_book/en/imgs/bm39_result.png -------------------------------------------------------------------------------- /docs/_book/en/imgs/bm42_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/_book/en/imgs/bm42_result.png -------------------------------------------------------------------------------- /docs/_book/en/imgs/bm43_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/_book/en/imgs/bm43_result.png -------------------------------------------------------------------------------- /docs/_book/en/imgs/bm44_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/_book/en/imgs/bm44_result.png -------------------------------------------------------------------------------- /src/core/Utils/Random.ts: -------------------------------------------------------------------------------- 1 | export function randomNumber(max) { 2 | return Math.floor(Math.random() * (max)); 3 | } 4 | -------------------------------------------------------------------------------- /src/interface/styles/utils/main.scss: -------------------------------------------------------------------------------- 1 | .w-50 { 2 | width: 50%; 3 | } 4 | 5 | .w-100 { 6 | width: 100%; 7 | } 8 | -------------------------------------------------------------------------------- /docs/_book/gitbook/images/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/_book/gitbook/images/favicon.ico -------------------------------------------------------------------------------- /src/interface/styles/components/IntervalModalComponent.scss: -------------------------------------------------------------------------------- 1 | .intervalForm { 2 | margin-bottom: 40px; 3 | height: 50px; 4 | } 5 | -------------------------------------------------------------------------------- /src/interface/styles/vendor/main.scss: -------------------------------------------------------------------------------- 1 | @import "bootstrap/scss/bootstrap"; 2 | @import "@fortawesome/fontawesome-free/css/all.css"; 3 | -------------------------------------------------------------------------------- /docs/_book/gitbook/fonts/fontawesome/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/_book/gitbook/fonts/fontawesome/FontAwesome.otf -------------------------------------------------------------------------------- /src/interface/styles/components/PrefetchDecoderComponent.scss: -------------------------------------------------------------------------------- 1 | .smd-prefetch_decoder { 2 | .smd-table_cell { 3 | width: 100%; 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | dist/ 3 | coverage/ 4 | .vscode 5 | Session.vim 6 | 7 | .direnv/ 8 | .pre-commit-config.yaml 9 | result 10 | simde-sws* 11 | -------------------------------------------------------------------------------- /src/test/functional/code/r0inmutable.ts: -------------------------------------------------------------------------------- 1 | export const code =`1 2 | // Set R0 to 42 3 | ADDI R0 R0 #42 4 | // Copy value R0 -> R1 5 | ADD R1 R1 R0`; -------------------------------------------------------------------------------- /docs/_book/gitbook/fonts/fontawesome/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/_book/gitbook/fonts/fontawesome/fontawesome-webfont.eot -------------------------------------------------------------------------------- /docs/_book/gitbook/fonts/fontawesome/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/_book/gitbook/fonts/fontawesome/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /docs/_book/gitbook/fonts/fontawesome/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/_book/gitbook/fonts/fontawesome/fontawesome-webfont.woff -------------------------------------------------------------------------------- /docs/_book/gitbook/fonts/fontawesome/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/_book/gitbook/fonts/fontawesome/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /docs/_book/gitbook/images/apple-touch-icon-precomposed-152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SIMDE-ULL/SIMDE/HEAD/docs/_book/gitbook/images/apple-touch-icon-precomposed-152.png -------------------------------------------------------------------------------- /src/interface/actions/batch.ts: -------------------------------------------------------------------------------- 1 | export function batchActions(...actions) { 2 | return { 3 | type: 'BATCH_ACTIONS', 4 | actions: actions 5 | }; 6 | } 7 | -------------------------------------------------------------------------------- /src/interface/styles/components/Forms.scss: -------------------------------------------------------------------------------- 1 | .smd-forms { 2 | &_error { 3 | color: red; 4 | font-size: 0.875rem; 5 | padding: 0 1rem; 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /biome.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://biomejs.dev/schemas/1.6.3/schema.json", 3 | "formatter": { 4 | "indentStyle": "space", 5 | "indentWidth": 2 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/interface/styles/main.scss: -------------------------------------------------------------------------------- 1 | @import './base/main'; 2 | @import './components/main'; 3 | @import './vendor/main'; 4 | @import './utils/main'; 5 | @import './landingpage/main'; 6 | @import './projectpage/main'; 7 | -------------------------------------------------------------------------------- /docs/es/installation.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: es 4 | id: installation 5 | title: Installation 6 | prev: how-it-works.html 7 | next: using.html 8 | --- 9 | 10 | This is our installation markdown file 11 | -------------------------------------------------------------------------------- /src/interface/actions/load.ts: -------------------------------------------------------------------------------- 1 | export const SUPERSCALAR_LOAD = 'SUPERSCALAR_LOAD'; 2 | 3 | export function superscalarLoad(code) { 4 | return { 5 | type: SUPERSCALAR_LOAD, 6 | value: code 7 | }; 8 | } 9 | -------------------------------------------------------------------------------- /docs/en/installation.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: en 4 | id: installation 5 | title: Installation 6 | prev: en/how-it-works.html 7 | next: en/using.html 8 | --- 9 | 10 | This is our installation markdown file 11 | -------------------------------------------------------------------------------- /src/interface/styles/components/BatchResultsComponent.scss: -------------------------------------------------------------------------------- 1 | .smd-batch_results { 2 | &-entry { 3 | display: flex; 4 | 5 | &_label { 6 | margin-right: .5rem; 7 | } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/interface/styles/vendor/_bootstrap.scss: -------------------------------------------------------------------------------- 1 | @import '../base/variables'; 2 | 3 | .btn { 4 | &.btn-primary { 5 | background-color: $color-brand; 6 | color: $color-text-primary; 7 | } 8 | } 9 | 10 | -------------------------------------------------------------------------------- /docs/_book/en/installation.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: en 4 | id: installation 5 | title: Installation 6 | prev: en/how-it-works.html 7 | next: en/using.html 8 | --- 9 | 10 | This is our installation markdown file 11 | -------------------------------------------------------------------------------- /src/interface/styles/components/FunctionalUnitComponent.scss: -------------------------------------------------------------------------------- 1 | @import '../base/variables'; 2 | 3 | .smd-functional_unit { 4 | flex: 1 1 auto; 5 | 6 | .smd-table-header_title { 7 | width: 50%; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/interface/actions/memory-actions.ts: -------------------------------------------------------------------------------- 1 | export const NEXT_MEMORY_CYCLE = 'NEXT_MEMORY_CYCLE'; 2 | 3 | export function nextMemoryCycle(data) { 4 | return { 5 | type: NEXT_MEMORY_CYCLE, 6 | value: data 7 | }; 8 | } 9 | -------------------------------------------------------------------------------- /src/interface/styles/components/RegisterComponent.scss: -------------------------------------------------------------------------------- 1 | .smd-register { 2 | height: 100%; 3 | 4 | &_button { 5 | font-size: .875rem; 6 | margin-right: .125rem; 7 | padding: 0 .35rem; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/core/VLIW/VLIWError.ts: -------------------------------------------------------------------------------- 1 | export enum VLIWError { 2 | PCOUTOFRANGE = 4, 3 | ENDEXE = 3, 4 | BREAKPOINT = 2, 5 | OK = 1, 6 | ERRRAW = -4, 7 | ERRHARD = -3, 8 | ERRBRANCHDEP = -2, 9 | ERRPRED = -1, 10 | ERRNO = 0 11 | } 12 | -------------------------------------------------------------------------------- /src/interface/actions/basic-blocks-actions.ts: -------------------------------------------------------------------------------- 1 | export const VIEW_BASIC_BLOCKS = 'VIEW_BASIC_BLOCKS'; 2 | 3 | export function viewBasicBlocks(toggle) { 4 | return { 5 | type: VIEW_BASIC_BLOCKS, 6 | value: toggle 7 | }; 8 | } 9 | -------------------------------------------------------------------------------- /src/interface/actions/jump-table-actions.ts: -------------------------------------------------------------------------------- 1 | export const NEXT_JUMP_TABLE_CYCLE = 'NEXT_JUMP_TABLE_CYCLE'; 2 | 3 | export function nextJumpTableCycle(data) { 4 | return { 5 | type: NEXT_JUMP_TABLE_CYCLE, 6 | value: data 7 | }; 8 | } -------------------------------------------------------------------------------- /src/interface/actions/register-actions.ts: -------------------------------------------------------------------------------- 1 | export const NEXT_REGISTERS_CYCLE = 'NEXT_REGISTERS_CYCLE'; 2 | 3 | export function nextRegistersCycle(data) { 4 | return { 5 | type: NEXT_REGISTERS_CYCLE, 6 | value: data 7 | }; 8 | } 9 | -------------------------------------------------------------------------------- /docs/en/historial.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: en 4 | id: historial 5 | title: History 6 | prev: en/how-it-works.html 7 | next: en/using.html 8 | --- 9 | 10 | ## v1.0 16/06/2017 11 | 12 | Initial release with superescalar machine support. 13 | -------------------------------------------------------------------------------- /docs/es/menu-archivo.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: es 4 | id: menu-archivo 5 | title: Menú archivo 6 | prev: instruction-level-paralelism.html 7 | next: menu-ver.html 8 | --- 9 | 10 | ## Cargar... 11 | 12 | Permite abrir un código secuencial. 13 | -------------------------------------------------------------------------------- /src/interface/styles/components/ROBMapperComponent.scss: -------------------------------------------------------------------------------- 1 | .smd-rob_mapper { 2 | 3 | height: 100%; 4 | display: flex; 5 | flex-flow: column; 6 | 7 | &-body { 8 | flex: 1 1 0; 9 | overflow-y: scroll; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /docs/es/historial.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: es 4 | id: historial 5 | title: Historial 6 | prev: how-it-works.html 7 | next: autor.html 8 | --- 9 | 10 | ## v1.0 16/06/2017 11 | 12 | Liberada la versión inicial con soporte para la máquina superescalar. 13 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import react from "@vitejs/plugin-react"; 2 | import { defineConfig } from "vite"; 3 | import tsconfigPaths from "vite-tsconfig-paths"; 4 | 5 | // https://vitejs.dev/config/ 6 | export default defineConfig({ 7 | plugins: [react(), tsconfigPaths()], 8 | }); 9 | -------------------------------------------------------------------------------- /src/interface/styles/components/JumpPredictionComponent.scss: -------------------------------------------------------------------------------- 1 | .smd-jump_prediction { 2 | 3 | height: 100%; 4 | display: flex; 5 | flex-flow: column; 6 | 7 | &-body { 8 | flex: 1 1 0; 9 | overflow-y: scroll; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/test/functional/code/nuevaOp.ts: -------------------------------------------------------------------------------- 1 | export const codeInput = `7 2 | ADDI R2 R0 #3 3 | BGT R0 R2 ET1 4 | ADDI R3 R0 #2 5 | ET1: 6 | SUB R4 R3 R2 7 | BGT R2 R3 ET2 8 | SUB R5 R2 R3 9 | ET2: 10 | SUB R6 R2 R3 11 | `; 12 | 13 | export const resultContent = [3, 2, -1, 0, 1]; -------------------------------------------------------------------------------- /docs/en/menu-archivo.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: en 4 | id: menu-archivo 5 | title: File menu 6 | prev: en/instruction-level-paralelism.html 7 | next: en/menu-ver.html 8 | --- 9 | 10 | ## Open... 11 | 12 | Use this menu item to open an existing sequential code file. 13 | -------------------------------------------------------------------------------- /src/interface/styles/components/RegistersTabComponent.scss: -------------------------------------------------------------------------------- 1 | .smd-register-tab { 2 | display: flex; 3 | width: 100%; 4 | height: 100%; 5 | padding-bottom: 2rem; 6 | 7 | &_register { 8 | width: 33.3333%; 9 | height: 100%; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/interface/styles/components/ReorderBufferComponent.scss: -------------------------------------------------------------------------------- 1 | .smd-reorder_buffer { 2 | 3 | height: 100%; 4 | color: black !important; 5 | 6 | .smd-table-header_title { 7 | width: 16.6667%; 8 | } 9 | 10 | &_entry { 11 | cursor: pointer; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/interface/styles/components/ReserveStationComponent.scss: -------------------------------------------------------------------------------- 1 | @import '../base/variables'; 2 | 3 | .smd-reserve_station { 4 | flex: 1 1 auto; 5 | 6 | .smd-table-header_title { 7 | width: 14%; 8 | } 9 | 10 | .smd-table_cell { 11 | width: 14%; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/interface/styles/components/SuperscalarConfigModalComponent.scss: -------------------------------------------------------------------------------- 1 | legend.control-label { 2 | font-size: 14px; 3 | font-weight: bolder; 4 | border-bottom: 0px; 5 | } 6 | 7 | .extraParams { 8 | border: 1px solid #D3D3D3; 9 | padding: 10px; 10 | text-align: right; 11 | } 12 | -------------------------------------------------------------------------------- /src/interface/actions/reorder-buffer-mapper-actions.ts: -------------------------------------------------------------------------------- 1 | export const NEXT_REORDER_BUFFER_MAPPER_CYCLE = 'NEXT_REORDER_BUFFER_MAPPER_CYCLE'; 2 | 3 | export function nextReorderBufferMapperCycle(data) { 4 | return { 5 | type: NEXT_REORDER_BUFFER_MAPPER_CYCLE, 6 | value: data 7 | }; 8 | } 9 | -------------------------------------------------------------------------------- /docs/es/bloques-basicos.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: es 4 | id: bloques-basicos 5 | title: Bloques básicos 6 | prev: autor.html 7 | next: desenrollado-de-bucles.html 8 | --- 9 | 10 | Los bloques básicos son fragmentos de código que tienen una única entrada y una única salida, de tal manera que sus instrucciones se ejecutan secuencialmente. -------------------------------------------------------------------------------- /docs/en/bloques-basicos.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: en 4 | id: bloques-basicos 5 | title: Bloques básicos 6 | prev: en/autor.html 7 | next: en/desenrollado-de-bucles.html 8 | --- 9 | 10 | A basic block is a straight-line piece of code without any jumps or jump targets in the middle; jump targets, if any, start a block, and jumps end a block. -------------------------------------------------------------------------------- /docs/en/rob-registros.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: en 4 | id: rob-registros 5 | title: ROB<->Registers 6 | prev: en/decodificador.html 7 | next: en/tabla-de-prediccion-de-salto.html 8 | --- 9 | 10 | This is what Tomasulo's algorithm calls the Qi field. It indicates if a GPR is being used by a ROB entry (it shows the entry number) or not (-1). 11 | -------------------------------------------------------------------------------- /docs/en/nat-gpr-fpr.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: es 4 | id: nat-gpr-fpr 5 | title: NaT(GPR y FPR) 6 | prev: en/maquina-vliw.html 7 | next: en/registro-predicado.html 8 | --- 9 | 10 | Each FPR or GPR has an associated NaT (Not A Thing) bit. If this register is the destination of a LOAD operation, and this operation results in a cache miss this bit is set to 1. 11 | 12 | -------------------------------------------------------------------------------- /src/store.ts: -------------------------------------------------------------------------------- 1 | import { enableBatching } from './interface/reducers/batching'; 2 | import { createStore, Store } from 'redux'; 3 | import reducers from './interface/reducers'; 4 | 5 | declare var window; 6 | export let store: Store = createStore( 7 | enableBatching(reducers), 8 | window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__() 9 | ); 10 | -------------------------------------------------------------------------------- /src/interface/reducers/batching.ts: -------------------------------------------------------------------------------- 1 | export function enableBatching(reducer) { 2 | return function batchingReducer(state, action) { 3 | switch (action.type) { 4 | case 'BATCH_ACTIONS': 5 | return action.actions.reduce(batchingReducer, state); 6 | default: 7 | return reducer(state, action); 8 | } 9 | }; 10 | } 11 | -------------------------------------------------------------------------------- /docs/en/calculo-de-direcciones.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: en 4 | id: calculo-de-direcciones 5 | title: Memory Address ALU 6 | prev: en/estaciones-de-reserva.html 7 | next: en/maquina-vliw.html 8 | --- 9 | 10 | The memory address ALU is a special FU of the Superscalar processor that computes the memory address of a LOAD or STORE instruction once the base register is available. 11 | -------------------------------------------------------------------------------- /src/interface/actions/cycle-actions.ts: -------------------------------------------------------------------------------- 1 | export const NEXT_CYCLE = 'NEXT_CYCLE'; 2 | export const CURRENT_PC = 'CURRENT_PC'; 3 | 4 | export function nextCycle(data) { 5 | return { 6 | type: NEXT_CYCLE, 7 | value: data 8 | }; 9 | } 10 | 11 | export function currentPC(data) { 12 | return { 13 | type: CURRENT_PC, 14 | value: data 15 | }; 16 | } 17 | -------------------------------------------------------------------------------- /docs/es/nat-gpr-fpr.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: es 4 | id: nat-gpr-fpr 5 | title: NaT(GPR y FPR) 6 | prev: maquina-vliw.html 7 | next: registro-predicado.html 8 | --- 9 | 10 | Cada registro (FP o GP) lleva asociado un campo NaT (Not A Thing). Este campo indica, cuando se pone a VERDADERO, que el registro asociado es destino de una operación de LOAD que tuvo un fallo de caché. 11 | 12 | -------------------------------------------------------------------------------- /docs/en/crear-codigo-vliw.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: es 4 | id: crear-codigo-vliw 5 | title: Crear código VLIW 6 | prev: en/configurar-instrucciones-vliw.html 7 | next: en/cargar-codigo-vliw.html 8 | --- 9 | 10 | Click on Configure=>VLIW Instructions=>Load VLIW Code.... 11 | 12 | You can select a ".vliw" file from a dialog box that contains an already created VLIW code. 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /docs/en/decodificador.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: en 4 | id: decodificador 5 | title: Decoder 6 | prev: en/unidad-de-prebusqueda.html 7 | next: en/rob-registros.html 8 | --- 9 | 10 | The Decoder) selects the instructions and sends them to the corresponding RE. 11 | It also implements the control logic for stopping the execution flow if the ROB or an ER destination for the next instruction are full. 12 | -------------------------------------------------------------------------------- /docs/es/rob-registros.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: es 4 | id: rob-registros 5 | title: ROB<->Registros 6 | prev: decodificador.html 7 | next: tabla-de-prediccion-de-salto.html 8 | --- 9 | 10 | Es el campo Qi del que se habla en el algoritmo de Tomasulo. Indica si un registro de propósito general está siendo usado por alguna entrada del ROB (en cuyo caso se mostrará el número de la entrada) o no (-1). 11 | -------------------------------------------------------------------------------- /docs/es/calculo-de-direcciones.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: es 4 | id: calculo-de-direcciones 5 | title: Cálculo de direcciones 6 | prev: estaciones-de-reserva.html 7 | next: maquina-vliw.html 8 | --- 9 | 10 | La ALU de Cálculo de Direcciones es una U.F. especial de la máquina Superescalar que se encarga únicamente del cálculo de la dirección de una instrucción de memoria, tanto LOADS como STORES. 11 | 12 | -------------------------------------------------------------------------------- /docs/_book/gitbook/gitbook-plugin-livereload/plugin.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | var newEl = document.createElement('script'), 3 | firstScriptTag = document.getElementsByTagName('script')[0]; 4 | 5 | if (firstScriptTag) { 6 | newEl.async = 1; 7 | newEl.src = '//' + window.location.hostname + ':35729/livereload.js'; 8 | firstScriptTag.parentNode.insertBefore(newEl, firstScriptTag); 9 | } 10 | 11 | })(); 12 | -------------------------------------------------------------------------------- /docs/es/autor.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: es 4 | id: autor 5 | title: Contactar con el autor 6 | prev: referencias.html 7 | next: bloques-basicos.html 8 | --- 9 | 10 | La versión original de esta documentación y la aplicación a la 11 | que hace referencia a sido realizada por Iván Castilla Rodríguez. 12 | 13 | La nueva versión de la aplicación y la documentación ha sido 14 | realizada por Adrián Abreu González. 15 | -------------------------------------------------------------------------------- /docs/en/unidad-de-prebusqueda.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: en 4 | id: unidad-de-prebusqueda 5 | title: Prefetch Unit 6 | prev: en/maquina-superescalar.html 7 | next: en/decodificador.html 8 | --- 9 | 10 | The Prefetch Unit) reads blocks of instructions from the instruction cache to maintain the execution flow. It dynamically uses the Branch Prediction Table. 11 | 12 | This unit stores up to 2 x Issue Rate instructions per cycle. -------------------------------------------------------------------------------- /docs/es/cargar-codigo-vliw.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: es 4 | id: cargar-codigo-vliw 5 | title: Cargar código VLIW 6 | prev: crear-codigo-vliw.html 7 | next: modificar-codigo-vliw.html 8 | --- 9 | 10 | Configurar=>Instrucciones VLIW=>Cargar Programa VLIW. 11 | 12 | Se le abrirá un cuadro de diálogo en el que podrá seleccionar el fichero ".vliw"que contiene el programa diseñado. 13 | 14 | Después de cargarlo puede modificarlo. 15 | -------------------------------------------------------------------------------- /docs/es/decodificador.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: es 4 | id: decodificador 5 | title: Decodificador 6 | prev: unidad-de-prebusqueda.html 7 | next: rob-registros.html 8 | --- 9 | 10 | El Decodificador (Decoder) se encarga de interpretar las instrucciones para enviarlas a su E.R. correspondiente. 11 | Implementa la lógica de control que permite retener el flujo si el ROB o la E.R. a la que va la próxima instrucción están llenos. 12 | -------------------------------------------------------------------------------- /src/main.scss: -------------------------------------------------------------------------------- 1 | @import 'interface/styles/main'; 2 | @import url('https://fonts.googleapis.com/css?family=Montserrat'); 3 | 4 | body, html { 5 | font-family: 'Montserrat', Helvetica, Arial, sans-serif; 6 | font-size: $font-size-base; 7 | } 8 | 9 | body { 10 | width: 100%; 11 | overflow-y: hidden; 12 | } 13 | 14 | @media (max-width: 1280px) { 15 | body, html { 16 | font-size: $font-size-base-sm; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/test/functional/code/speculativenosideeffects.ts: -------------------------------------------------------------------------------- 1 | export const codeInput = `1 2 | // Ensure we delay the branch enough so that the speculative instruction are executed 3 | LW R1 0(R0) 4 | LW R2 0(R1) 5 | LW R3 0(R2) 6 | BEQ R3 R0 NOSPEC 7 | ADDI R5 R5 #1 // Change GPR 8 | SW R5 5(R0) // Change memory 9 | LF F1 5(R0) // Change FPR 10 | BEQ R0 R0 NOSPEC // Change jump prediction table 11 | NOSPEC: 12 | ADDI R6 R5 #1`; -------------------------------------------------------------------------------- /docs/en/cargar-codigo-vliw.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: es 4 | id: cargar-codigo-vliw 5 | title: Cargar código VLIW 6 | prev: en/crear-codigo-vliw.html 7 | next: en/modificar-codigo-vliw.html 8 | --- 9 | 10 | Click on Configure=>VLIW Instructions=>Create New VLIW Code. 11 | 12 | This option opens the design window for VLIW code, where you can create a new VLIW code just from the current VLIW configuration and the current sequential code. 13 | 14 | -------------------------------------------------------------------------------- /src/interface/styles/base/variables.scss: -------------------------------------------------------------------------------- 1 | $color-brand-light: #BC87BC; 2 | $color-brand: #7A3B7A; 3 | 4 | $color-brand-secondary: #006699; 5 | 6 | $color-background-primary: #666666; 7 | 8 | $color-text-primary: #EBF3FA; 9 | 10 | 11 | // Font size 12 | $font-size-base: 1rem; 13 | $font-size-base-sm: 1rem; 14 | 15 | $font-size-xs: 0.75rem; 16 | $font-size-sm: 0.875rem; 17 | $font-size-m: 1rem; 18 | $font-size-lg: 1.25rem; 19 | $font-size-xl: 1.75rem; 20 | -------------------------------------------------------------------------------- /src/interface/actions/prefetch-decoder-actions.ts: -------------------------------------------------------------------------------- 1 | export const NEXT_PREFETCH_CYCLE = 'NEXT_PREFETCH_CYCLE'; 2 | export const NEXT_DECODER_CYCLE = 'NEXT_DECODER_CYCLE'; 3 | 4 | export function nextPrefetchCycle(data) { 5 | return { 6 | type: NEXT_PREFETCH_CYCLE, 7 | value: data 8 | }; 9 | } 10 | 11 | export function nextDecoderCycle(data) { 12 | return { 13 | type: NEXT_DECODER_CYCLE, 14 | value: data 15 | }; 16 | } -------------------------------------------------------------------------------- /docs/es/crear-codigo-vliw.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: es 4 | id: crear-codigo-vliw 5 | title: Crear código VLIW 6 | prev: configurar-instrucciones-vliw.html 7 | next: cargar-codigo-vliw.html 8 | --- 9 | 10 | Configurar=>Instrucciones VLIW=>Crear Nuevo Programa VLIW. 11 | 12 | Se abrirá la ventana de diseño de código VLIW, donde puede construir un código VLIW a partir de la configuración actual de la máquina y el código secuencial actualmente cargado. 13 | 14 | 15 | -------------------------------------------------------------------------------- /docs/en/configurar-parametros-vliw.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: en 4 | id: configurar-parametros-vliw 5 | title: Ventana de instrucciones 6 | prev: en/configurar-parametros-superescalar.html 7 | next: en/configurar-parametros-vliw.html 8 | --- 9 | 10 | Click on Configure=>VLIW Configuration. 11 | 12 | 13 | The configurable parameters are the U.F. (except the U.F. jump, limited to 1) and the Latency of each. 14 | In addition you can define the latency when there is a Cache Failure. -------------------------------------------------------------------------------- /docs/es/configurar-instrucciones-vliw.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: es 4 | id: configurar-instrucciones-vliw 5 | title: Configurar instrucciones VLIW 6 | prev: configurar-parametros-vliw.html 7 | next: crear-codigo-vliw.html 8 | --- 9 | 10 | Configurar => Instrucciones VLIW 11 | 12 | Contiene los menús para diseñar un código VLIW: 13 | 14 | * **Crear Nuevo Programa VLIW**: Permite crear un nuevo código VLIW 15 | * **Cargar Programa VLIW...**: Permite cargar un código VLIW desde un fichero 16 | -------------------------------------------------------------------------------- /docs/es/unidad-de-prebusqueda.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: es 4 | id: unidad-de-prebusqueda 5 | title: Unidad de prebúsqueda 6 | prev: maquina-superescalar.html 7 | next: decodificador.html 8 | --- 9 | 10 | La Unidad de Prebúsqueda (Prefetch Unit) se encarga de adquirir de forma transparente al resto de la máquina las instrucciones del flujo de ejecución. 11 | Para ello tiene en cuenta la tabla de predicción de salto. 12 | 13 | Esta unidad mantiene en cada ciclo hasta 2 x Emisión instrucciones. -------------------------------------------------------------------------------- /src/interface/styles/components/Tabs.scss: -------------------------------------------------------------------------------- 1 | @import '../base/variables'; 2 | 3 | .nav.nav-tabs { 4 | position: absolute; 5 | top: 2rem; 6 | right: 1rem; 7 | 8 | &>li>a{ 9 | border: 1px solid rgba(0,0,0,0.2); 10 | } 11 | 12 | &>li.active>a { 13 | background-color: $color-brand; 14 | color: $color-text-primary; 15 | } 16 | } 17 | 18 | .tab-content { 19 | height: 91vh; 20 | 21 | &>div { 22 | height: 100%; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /docs/en/menu-ventana.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: en 4 | id: menu-ventana 5 | title: Window menu 6 | prev: en/menu-ejecutar.html 7 | next: en/menu-ayuda.html 8 | --- 9 | 10 | This menu contains the window management options. 11 | 12 | 13 | ### Mosaic 14 | 15 | Use this menu item to align all application windows. 16 | 17 | 18 | ### Tile 19 | 20 | Use this menu item to tile all application windows. 21 | 22 | 23 | ### Restore all 24 | 25 | Use this menu item to restore all minimized windows. 26 | -------------------------------------------------------------------------------- /docs/es/menu-ventana.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: es 4 | id: menu-ventana 5 | title: Menú Ventana 6 | prev: menu-ejecutar.html 7 | next: menu-ayuda.html 8 | --- 9 | 10 | Contiene las opciones para el control de las ventanas de la aplicación. 11 | 12 | 13 | ### Mosaico 14 | 15 | Coloca todas las ventanas como un mosaico. 16 | 17 | 18 | ### Cascada 19 | 20 | Coloca todas las ventanas en cascada. 21 | 22 | 23 | ### Restaurar todo 24 | 25 | Vuelve a mostrar todas las ventanas que estén minimizadas. -------------------------------------------------------------------------------- /.github/renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://docs.renovatebot.com/renovate-schema.json", 3 | "extends": [ 4 | "config:base" 5 | ], 6 | "packageRules": [ 7 | { 8 | "matchPackagePatterns": [ 9 | "*" 10 | ], 11 | "matchUpdateTypes": [ 12 | "minor", 13 | "patch" 14 | ], 15 | "groupName": "all non-major dependencies", 16 | "groupSlug": "all-minor-patch", 17 | "schedule": [ 18 | "before 6am on Monday" 19 | ] 20 | } 21 | ] 22 | } 23 | -------------------------------------------------------------------------------- /src/test/functional/code/despl.ts: -------------------------------------------------------------------------------- 1 | export const codeInput = `10 2 | ADDI R1 R0 #3 3 | ADDI R2 R0 #2 4 | SLLV R3 R1 R2 5 | SRLV R4 R1 R2 6 | ADDI R5 R0 #11 7 | ADDI R6 R0 #6 8 | OR R7 R5 R6 9 | AND R8 R5 R6 10 | NOR R9 R5 R6 11 | XOR R10 R5 R6`; 12 | 13 | export const vliwCodeInput = ` 14 | 2 0 0 0 0 1 0 1 0 15 | 0 16 | 2 2 0 0 0 3 0 1 0 17 | 2 4 0 0 0 5 0 1 0 18 | 0 19 | 2 5 0 0 0 6 0 1 0 20 | 2 7 0 0 0 8 0 1 0 21 | 1 9 0 0 0`.trim(); 22 | 23 | export const resultContent = [3, 2, 12, 0, 11, 6, 15, 2, -16, 13]; 24 | -------------------------------------------------------------------------------- /.github/workflows/release-please.yml: -------------------------------------------------------------------------------- 1 | # .github/workflows/release-please.yml 2 | # This workflow handles the release-please system that manages releasing new versions. 3 | # See: https://github.com/googleapis/release-please 4 | name: release-please 5 | on: 6 | push: 7 | branches: 8 | - main 9 | jobs: 10 | release-please: 11 | runs-on: ubuntu-latest 12 | steps: 13 | - uses: google-github-actions/release-please-action@v4 14 | with: 15 | release-type: node 16 | default-branch: main 17 | -------------------------------------------------------------------------------- /docs/es/configurar-parametros-vliw.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: es 4 | id: configurar-parametros-vliw 5 | title: Configurar parámetros VLIW 6 | prev: configurar-parametros-superescalar.html 7 | next: configurar-instrucciones-vliw.html 8 | --- 9 | 10 | {bmc bm1.BMP} Vaya a Configurar=>Parámetros VLIW. 11 | 12 | {bmc bm18.BMP} 13 | 14 | Los parámetros configurables son el Número de U.F. (excepto las U.F. de salto, limitadas a 1) y la Latencia de cada una. 15 | Además se puede definir la latencia cuando hay un Fallo de Caché. 16 | -------------------------------------------------------------------------------- /.github/workflows/review.yml: -------------------------------------------------------------------------------- 1 | name: reviewdog 2 | 3 | on: [ pull_request ] 4 | 5 | jobs: 6 | biome: 7 | name: runner / Biome 8 | runs-on: ubuntu-latest 9 | permissions: 10 | contents: read 11 | pull-requests: write 12 | steps: 13 | - uses: actions/checkout@v4 14 | - uses: pnpm/action-setup@v4.1.0 15 | - uses: actions/setup-node@v4 16 | with: 17 | node-version: 20.19.x 18 | - run: pnpm install --frozen-lockfile 19 | - uses: mongolyy/reviewdog-action-biome@v1 20 | -------------------------------------------------------------------------------- /docs/en/desenrollado-de-bucles.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: en 4 | id: desenrolladodebucles 5 | title: Loop unrolling 6 | prev: en/bloques-basicos.html 7 | next: en/software-pipelining.html 8 | --- 9 | 10 | {%ace lang='asm'%} 11 | // Original loop 12 | LOOP: 13 | LF F1 (R2) 14 | ADDF F1 F1 F0 15 | DADDUI R2 R2 #1 16 | BNE R2 R5 LOOP 17 | 18 | // Unrolling loop (2 iterations) 19 | LOOP: 20 | LF F1 (R2) 21 | ADDF F1 F1 F0 22 | LF F2 1(R2) 23 | ADDF F2 F2 F0 24 | DADDUI R2 R2 #2 25 | BNE R2 R5 LOOP 26 | {%endace%} -------------------------------------------------------------------------------- /docs/en/configurar-instrucciones-vliw.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: es 4 | id: configurar-instrucciones-vliw 5 | title: Configurar instrucciones VLIW 6 | prev: en/configurar-parametros-vliw.html 7 | next: en/crear-codigo-vliw.html 8 | --- 9 | 10 | Click on Configure=>VLIW Configuration. 11 | 12 | This menu contains some useful options in order to design a VLIW code: 13 | 14 | * **Create New VLIW Code**: Use this menu item to create a blank VLIW code. 15 | * **Load VLIW Code...**: Use this menu item to load a VLIW code from a file. 16 | 17 | -------------------------------------------------------------------------------- /docs/es/menu-ayuda.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: es 4 | id: menu-ayuda 5 | title: Menú Ayuda 6 | prev: menu-ventana.html 7 | next: barra-de-herramientas-estandar.html 8 | --- 9 | 10 | ### Contenido 11 | 12 | Muestra el contenido general de la Ayuda. 13 | 14 | 15 | ### Buscar Ayuda Sobre... 16 | 17 | Muestra la ventana de búsqueda en el índice de la Ayuda. 18 | 19 | 20 | ### Cómo Usar la Ayuda 21 | 22 | Explica cómo emplear las ventanas de Ayuda. 23 | 24 | 25 | ### Acerca... 26 | 27 | Información general de la Aplicación. 28 | 29 | -------------------------------------------------------------------------------- /src/test/functional/code/bucleint.ts: -------------------------------------------------------------------------------- 1 | export const codeInput = `// SWMDE v0.1 2 | // Autor: Iván Castilla Rodríguez 3 | // Utilidad: Programa de testeo de SWMDE que crea la sucesión An = (An-1 * 2) + 3 durante 4 | // 5 iteraciones y con A0 = 1 5 | // Comentarios: Este programa usa únicamente operaciones enteras y bucles sin hacer uso de 6 | // instrucciones de memoria ni de punto flotante 7 | 8 8 | ADDI R1 R0 #1 9 | ADDI R2 R0 #2 10 | ADDI R3 R0 #0 11 | ADDI R4 R0 #5 12 | LOOP: 13 | MULT R5 R1 R2 14 | ADDI R1 R5 #3 15 | ADDI R3 R3 #1 16 | BNE R3 R4 LOOP`; -------------------------------------------------------------------------------- /src/test/unit/core/Common/Instruction.spec.ts: -------------------------------------------------------------------------------- 1 | import { expect, beforeEach, test } from 'vitest' 2 | import { Instruction } from '../../../../core/Common/Instruction'; 3 | 4 | let originalInstruction; 5 | 6 | beforeEach(() => { 7 | originalInstruction = new Instruction(); 8 | originalInstruction.id = 100; 9 | }); 10 | 11 | test('Copied instructions should not keep the same reference', t => { 12 | let newInstruction = new Instruction(originalInstruction); 13 | originalInstruction.id = 1; 14 | expect(newInstruction.operands).not.toBe(100); 15 | }); -------------------------------------------------------------------------------- /docs/en/tabla-de-prediccion-de-salto.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: en 4 | id: tabla-de-prediccion-de-salto 5 | title: Branch prediction 6 | prev: en/rob-registros.html 7 | next: en/reorder-buffer.html 8 | --- 9 | 10 | The Branch Prediction Table uses a 2-bit scheme to predict if a branch must be taken or not. 11 | 12 | The table has 16 entries. The last 4 bits of the memory address of a branch instruction are used to know what entry corresponds to the branch. 13 | 14 | The next scheme shows how the 2-bits algorithm works. 15 | 16 | ![](imgs/bm41.png) 17 | 18 | -------------------------------------------------------------------------------- /src/interface/actions/history.ts: -------------------------------------------------------------------------------- 1 | export const RESET_HISTORY = 'RESET_HISTORY'; 2 | export const PUSH_HISTORY = 'PUSH_HISTORY'; 3 | export const TAKE_HISTORY = 'TAKE_HISTORY'; 4 | 5 | export function takeHistory(index) { 6 | return { 7 | type: TAKE_HISTORY, 8 | value: index 9 | }; 10 | } 11 | 12 | export function pushHistory() { 13 | return { 14 | type: PUSH_HISTORY, 15 | value: true 16 | }; 17 | } 18 | 19 | export function resetHistory() { 20 | return { 21 | type: RESET_HISTORY, 22 | value: true 23 | }; 24 | } 25 | -------------------------------------------------------------------------------- /src/interface/styles/components/FileBarComponent.scss: -------------------------------------------------------------------------------- 1 | @import '../base/variables'; 2 | 3 | .navigation-bars { 4 | height: 9vh; 5 | 6 | .smd-filebar { 7 | display: flex; 8 | 9 | button { 10 | background-color: transparent; 11 | border: none; 12 | border-radius: 0px; 13 | color: black; 14 | 15 | &:focus, &:active { 16 | background-color: $color-brand; 17 | border-color: transparent; 18 | color: white; 19 | } 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /docs/en/configurar-parametros-superescalar.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: en 4 | id: configurar-parametros-superescalar 5 | title: Superscalar Configuration 6 | prev: en/ventana-de-instrucciones.html 7 | next: en/ventana-registros-memoria.html 8 | --- 9 | 10 | *Click on Configure => Superscalar Configuration*. 11 | 12 | ![](imgs/bm17_result.png) 13 | 14 | You can configure the Number and the Latency for each type of Functional Unit. 15 | You can configure cache miss latency too. 16 | 17 | The Issue Rate sets the number of instructions which are issued (and commited) by clock cycle. 18 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | SIMDE 8 | 9 | 10 | 11 | 14 |
15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/interface/reducers/color.ts: -------------------------------------------------------------------------------- 1 | import { COLOR_CELL } from "../actions"; 2 | 3 | export const initialState = { 4 | uidColors: {}, 5 | IidColors: {} 6 | } 7 | 8 | export function ColorReducers(state = initialState, action) { 9 | switch (action.type) { 10 | case COLOR_CELL: 11 | return (state = { 12 | ...state, 13 | uidColors: { 14 | ...state.uidColors, 15 | [action.value[0]]: action.value[1] 16 | } 17 | }); 18 | default: 19 | return state; 20 | } 21 | } -------------------------------------------------------------------------------- /src/interface/utils/Downloader.ts: -------------------------------------------------------------------------------- 1 | export function downloadTextFile(filename: string, text: string) { 2 | const url = URL.createObjectURL(new Blob([text], { type: 'text/plain;charset=utf-8' })); 3 | const a = document.createElement('a'); 4 | a.href = url; 5 | a.download = filename; 6 | a.style.display = 'none'; 7 | document.body.appendChild(a); 8 | a.click(); 9 | document.body.removeChild(a); 10 | URL.revokeObjectURL(url); 11 | } 12 | 13 | export function downloadJsonFile(filename: string, object: any) { 14 | downloadTextFile(filename, JSON.stringify(object)); 15 | } -------------------------------------------------------------------------------- /docs/en/autor.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: en 4 | id: autor 5 | title: Contact with the autor 6 | prev: en/referencias.html 7 | next: en/bloques-basicos.html 8 | --- 9 | 10 | The original version of this documentation and the application it references have been made by Iván Castilla Rodríguez. 11 | 12 | The new version of this application and this documentation have 13 | been made by Adrián Abreu González. 14 | 15 | If you have any suggestion about this application, please contact us 16 | at: 17 | 18 | [alu0100601398@ull.edu.es](alu0100601398@ull.edu.es) 19 | [icasrod@ull.edu.es](icasrod@ull.edu.es) -------------------------------------------------------------------------------- /src/interface/styles/components/AccessBarComponent.scss: -------------------------------------------------------------------------------- 1 | @import '../base/variables'; 2 | 3 | .smd-access_bar { 4 | padding: 0.5rem 0rem; 5 | 6 | a { 7 | padding: 1.5rem 1.5rem; 8 | color: black; 9 | cursor: pointer; 10 | } 11 | 12 | .smd-cycle { 13 | display: inline-block; 14 | margin-right: 1rem; 15 | 16 | &_label { 17 | margin-right: 0.5rem; 18 | } 19 | } 20 | 21 | .smd-speed { 22 | &_value { 23 | margin-left: .5rem; 24 | text-align: center; 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/core/Common/InstructionFormats.ts: -------------------------------------------------------------------------------- 1 | import { Opcodes } from "./Opcodes"; 2 | 3 | export enum Formats { 4 | TwoGeneralRegisters = 0, // OP R1, R2, R3 5 | TwoFloatingRegisters, // OP F1, F2, F3 6 | GeneralRegisterAndInmediate, // OP R1, R2, #X 7 | GeneralLoadStore, // OP R1, X(R2) 8 | FloatingLoadStore, // OP F1, X(R2) 9 | Jump, // OP R1, R2, label 10 | Noop, // NOP 11 | } 12 | 13 | export let FormatsNames: string[] = [ 14 | "TwoGeneralRegisters", 15 | "TwoFloatingRegisters", 16 | "GeneralRegisterAndInmediate", 17 | "GeneralLoadStore", 18 | "FloatingLoadStore", 19 | "Jump", 20 | "Noop", 21 | ]; 22 | -------------------------------------------------------------------------------- /src/interface/reducers/index.ts: -------------------------------------------------------------------------------- 1 | import { combineReducers } from 'redux' 2 | import { MachineReducers, type initialState as machineInitialState } from './machine' 3 | import { ColorReducers, type initialState as colorsInitialState } from './color' 4 | import { UiReducers, type initialState as uiInitialState } from './ui' 5 | 6 | export interface GlobalState { 7 | Machine: typeof machineInitialState, 8 | Ui: typeof uiInitialState, 9 | Colors: typeof colorsInitialState 10 | } 11 | 12 | export default combineReducers({ 13 | Machine: MachineReducers, 14 | Ui: UiReducers, 15 | Colors: ColorReducers 16 | }) 17 | -------------------------------------------------------------------------------- /docs/en/menu-ayuda.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: en 4 | id: menu-ayuda 5 | title: Help menu 6 | prev: en/menu-ventana.html 7 | next: en/barra-de-herramientas-estandar.html 8 | --- 9 | 10 | ### Contents 11 | 12 | Use this menu item to show general contents from help. 13 | 14 | 15 | ### Find Help About... 16 | 17 | Use this menu item to find about a specific topic in help. 18 | 19 | 20 | ### How to use Help 21 | 22 | Use this menu item to obtain an explanation about the use of help window. 23 | 24 | 25 | ### About... 26 | 27 | Use this menu item to view the general description of the application and authors. 28 | 29 | 30 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing to SIMDE 2 | 3 | Thank you for your interest in contributing to SIMDE! What follows is a list of possible actions to contribute to this project: 4 | 5 | * Report any bug you encounter by [filing an issue](https://github.com/SIMDE-ULL/SIMDE/issues). 6 | 7 | * You can propose new features also by [filing an issue](https://github.com/SIMDE-ULL/SIMDE/issues). 8 | 9 | * Help by resolving [open issues](https://github.com/SIMDE-ULL/SIMDE/issues?q=is%3Aissue+is%3Aopen), especially those labeled as [_"good first issue"_](https://github.com/SIMDE-ULL/SIMDE/issues?q=is%3Aissue+is%3Aopen+label%3A"good+first+issue"). 10 | -------------------------------------------------------------------------------- /docs/en/registros-de-punto-flotante.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: en 4 | id: registros-de-punto-flotante 5 | title: Floating Point Registers 6 | prev: en/registros-de-proposito-general.html 7 | next: en/unidades-funcionales.html 8 | --- 9 | 10 | File with 64 32-bits single-precision registers. 11 | 12 | They are named F0, F1, F2, ..., F63. 13 | 14 | 15 | ### Access 16 | 17 | The VLIW processor has an special access mode. "Reads" are carried out in the first half of a clock cycle and "writes" in the second one. Thus, WAR hazards are avoided. The Superscalar processor doesn't need this mechanism because the ROB makes this job. 18 | 19 | -------------------------------------------------------------------------------- /docs/es/configurar-parametros-superescalar.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: es 4 | id: configurar-parametros-superescalar 5 | title: Configurar parámetros Superescalar 6 | prev: ventana-de-instrucciones.html 7 | next: configurar-parámetros-vliw.html 8 | --- 9 | 10 | *Vaya a Configurar => Parámetros Superescalar*. 11 | 12 | ![](imgs/bm17_result.png) 13 | 14 | Los parámetros configurables son el Número de U.F. y la Latencia de cada una. 15 | Además se puede definir la latencia cuando hay un Fallo de Caché. 16 | 17 | El otro parámetro modificable es el valor de Emisión, que indica el número de instrucciones que se emiten (y graduan) por ciclo. -------------------------------------------------------------------------------- /docs/es/registros-de-punto-flotante.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: es 4 | id: registros-de-punto-flotante 5 | title: Registros de punto flotante 6 | prev: registros-de-proposito-general.html 7 | next: unidades-funcionales.html 8 | --- 9 | Banco de 64 registros de 32 bits. Emplea simple precisión. 10 | 11 | Se denotan F0, F1, F2, ..., F63. 12 | 13 | 14 | ### Acceso 15 | 16 | En la máquina VLIW la lectura se realiza en la primera mitad del ciclo y la escritura en la segunda mitad. De esta manera se evitan los riesgos WAR. En la máquina Superescalar no tiene sentido este añadido, ya que este tipo de dependencias se eliminan con el ROB. 17 | -------------------------------------------------------------------------------- /src/core/Superscalar/SuperscalarEnums.ts: -------------------------------------------------------------------------------- 1 | export enum CommitStatus { 2 | SUPER_COMMITOK = 0, 3 | SUPER_COMMITEND, 4 | SUPER_COMMITMISS, 5 | SUPER_COMMITNO, 6 | } 7 | 8 | export enum SuperStage { 9 | SUPER_ISSUE = 0, 10 | SUPER_EXECUTE, 11 | SUPER_WRITERESULT, 12 | SUPER_COMMIT, 13 | } 14 | 15 | export enum SuperscalarStatus { 16 | SUPER_ENDEXE = -2, 17 | SUPER_BREAKPOINT = -1, 18 | SUPER_OK = 0, 19 | } 20 | 21 | export function stageToString(index: number): string { 22 | const stages = { 23 | 0: "ISSUE", 24 | 1: "EXECUTE", 25 | 2: "WRITE", 26 | 3: "COMMIT", 27 | }; 28 | return stages[index]; 29 | } 30 | -------------------------------------------------------------------------------- /src/interface/actions/index.ts: -------------------------------------------------------------------------------- 1 | export * from './cycle-actions'; 2 | export * from './functional-unit-actions'; 3 | export * from './jump-table-actions'; 4 | export * from './memory-actions'; 5 | export * from './prefetch-decoder-actions'; 6 | export * from './register-actions'; 7 | export * from './reorder-buffer-actions'; 8 | export * from './reorder-buffer-mapper-actions'; 9 | export * from './reserve-station-actions'; 10 | export * from './table-actions'; 11 | export * from './stats-actions'; 12 | 13 | export * from './load'; 14 | export * from './basic-blocks-actions'; 15 | 16 | export * from './predicate-nat-actions'; 17 | 18 | export * from './batch'; 19 | -------------------------------------------------------------------------------- /src/main.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom/client'; 3 | import { Provider } from 'react-redux'; 4 | import { I18nextProvider } from 'react-i18next'; 5 | 6 | import App from './interface/App.tsx'; 7 | import { store } from './store.ts'; 8 | import i18n from './i18n.ts'; // Initialize i18next instance 9 | import './main.scss'; 10 | 11 | ReactDOM.createRoot(document.getElementById('app')!).render( 12 | 13 | 14 | 15 | 16 | 17 | 18 | , 19 | ); 20 | -------------------------------------------------------------------------------- /docs/en/registro-predicado.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: es 4 | id: registro-predicado 5 | title: Registros de Predicado 6 | prev: en/nat-gpr-fpr.html 7 | next: en/predicacion-operaciones.html 8 | --- 9 | 10 | All operations in the VLIW processor have an associated Predicate Register. These registers hold a boolean value useful for the implementation of Operation Predication. An operation with an associated FALSE predicate register causes the operation to be canceled. 11 | 12 | The VLIW processor has 64 registers named p0, p1, ..., p63. 13 | 14 | The value of p0 is always TRUE. This register is used for operations with non-explicit predication. 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /docs/en/memoria.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: en 4 | id: memoria 5 | title: Memory 6 | prev: en/juego-de-instrucciones.html 7 | next: en/modos-de-direccionamiento.html 8 | --- 9 | 10 | The memory employes a ficticious scheme with two separated caches: instruction and data. 11 | 12 | ### Main Memory 13 | 14 | Main memory contains 1024 32-bit words. 15 | 16 | ### Instruction Cache 17 | 18 | The instruction cache is designed to completely contain the sequential code (and the VLIW code if it's been using too). Thus, instruction cache misses never occur. 19 | 20 | ### Data Cache 21 | 22 | The data cache generates random cache misses for loads. The miss rate is a user-defined parameter. 23 | -------------------------------------------------------------------------------- /docs/en/registros-de-proposito-general.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: en 4 | id: registros-de-proposito-general 5 | title: General Purpose Registers 6 | prev: en/modos-de-direccionamiento.html 7 | next: en/registros-de-punto-flotante.html 8 | --- 9 | 10 | File with 64 32-bits registers. 11 | 12 | They are named R0, R1, R2, ..., R63. 13 | 14 | 15 | ### R0 16 | 17 | The value of R0 is always 0. 18 | 19 | 20 | ### Access 21 | 22 | The VLIW processor has a special access mode. "Reads" are carried out in the first half of a clock cycle and "writes" in the second one. Thus, WAR hazards are avoided. The Superscalar processor doesn't need this mechanism because the ROB makes this job. 23 | 24 | 25 | -------------------------------------------------------------------------------- /src/interface/styles/components/LoadModalComponent.scss: -------------------------------------------------------------------------------- 1 | @import '../base/variables'; 2 | 3 | .smd-load_modal { 4 | textarea { 5 | width: 100%; 6 | height: 70vh; 7 | 8 | font-family: 'Courier New', Courier, monospace; 9 | } 10 | 11 | .btn.btn-primary { 12 | background: $color-brand; 13 | } 14 | 15 | &-footer { 16 | display: flex; 17 | justify-content: space-between; 18 | } 19 | 20 | &-actions { 21 | flex: 1 0 auto; 22 | } 23 | 24 | &-file_input { 25 | flex: 0 0 auto; 26 | } 27 | 28 | &-errors { 29 | .smd-forms_error { 30 | padding: 0; 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /docs/en/modos-de-direccionamiento.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: en 4 | id: modos-de-direccionamiento 5 | title: Addressing modes 6 | prev: en/memoria.html 7 | next: en/registros-de-proposito-general.html 8 | --- 9 | 10 | Only the indexed addressing is allowed: Imm(Rn). 11 | 12 | The address is computed by adding the immediate value (Inm) to the value read from the register (Rn) . 13 | Memory accesses are always computed as complete words, i.e. the immediate value is interpreted as a word value (and not as a byte value). 14 | 15 | ## Example 16 | 17 | {%ace lang='asm'%} 18 | // This example access to memory word 5 (3 + 2) to store R1 contents 19 | ADDI R4 R0 #2 20 | SI R1 3(R4) 21 | {%endace%} 22 | -------------------------------------------------------------------------------- /docs/es/registros-de-proposito-general.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: es 4 | id: registros-de-proposito-general 5 | title: Registros de propósito general 6 | prev: modos-de-direccionamiento.html 7 | next: registros-de-punto-flotante.html 8 | --- 9 | 10 | Banco de 64 registros de 32 bits. 11 | 12 | Se denotan R0, R1, R2, ..., R63. 13 | 14 | 15 | R0 16 | 17 | El valor de R0 se mantiene siempre a 0. 18 | 19 | 20 | Acceso 21 | 22 | En la máquina VLIW la lectura se realiza en la primera mitad del ciclo y la escritura en la segunda mitad. De esta manera se evitan los riesgos WAR. En la máquina Superescalar no tiene sentido este añadido, ya que este tipo de dependencias se eliminan con el ROB. 23 | 24 | -------------------------------------------------------------------------------- /docs/en/menu-ver.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: en 4 | id: menu-ver 5 | title: View menu 6 | prev: en/menu-archivo.html 7 | next: en/menu-configurar.html 8 | --- 9 | 10 | It contains the visualization options of the application. 11 | 12 | 13 | ## Basic Blocks 14 | 15 | Use this menu item to colour the basic blocks in the code window. 16 | 17 | 18 | ## Tool Bars 19 | 20 | Use this menu item to hide/show the tool bars of the application. There are two different tool bars: 21 | 22 | * The Standard tool bar, which contains basic options. 23 | * The Execution tool bar, for using in simulations. 24 | 25 | 26 | ## Sequential code 27 | 28 | Use this menu item to show/hide the sequential code loaded from a file. 29 | -------------------------------------------------------------------------------- /docs/en/software-pipelining.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: en 4 | id: software-pipelining 5 | title: Software Pipelining 6 | prev: en/desenrollado-de-bucles.html 7 | next: en/codigos-ejemplo.html 8 | --- 9 | 10 | ### Original loop 11 | 12 | {%ace lang='asm'%} 13 | LOOP: 14 | LF F1 (R2) 15 | ADDF F2 F1 F0 16 | SF F2 (R2) 17 | DADDUI R2 R2 #1 18 | BNE R2 R5 LOOP 19 | {%endace%} 20 | 21 | ### New loop (start-up and finish code ommited) 22 | 23 | {%ace lang='asm'%} 24 | LOOP: 25 | // SF belongs to 2 previous iterations 26 | SF F2 (R2) 27 | // ADDF belongs to 1 previous iteration 28 | ADDF F2 F1 F0 29 | // LF belongs to this iteration 30 | LF F1 2(R2) 31 | DADDUI R2 R2 #1 32 | BNE R2 R5 LOOP 33 | {%endace%} -------------------------------------------------------------------------------- /docs/es/registro-predicado.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: es 4 | id: registro-predicado 5 | title: Registros de Predicado 6 | prev: nat-gpr-fpr.html 7 | next: predicacion-operaciones.html 8 | --- 9 | 10 | Los Registros de Predicado son unos registros booleanos que se asocian con todas las operaciones de la máquina VLIW para implementar los mecanismos de Predicación de Operaciones. Si un Registro de Predicado asociado a una operación toma un valor FALSO implica la anulación de la ejecución de la operación. 11 | 12 | Se dispone de 64 registros denotados por p0, p1, ..., p63. 13 | 14 | El Registro de Predicado p0 siempre tiene como valor VERDADERO. Se emplea asociado con aquellas operaciones que no llevan Predicación explícita. 15 | -------------------------------------------------------------------------------- /docs/es/tabla-de-prediccion-de-salto.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: es 4 | id: tabla-de-prediccion-de-salto 5 | title: Tabla de predicción de salto 6 | prev: rob-registros.html 7 | next: reorder-buffer.html 8 | --- 9 | 10 | La Tabla de Predicción de Salto emplea un esquema de 2 bits para predecir si un salto debe ser tomado o no. 11 | 12 | La tabla tiene 16 entradas, que se corresponden con los 4 últimos bits de la posición en memoria de la instrucción de salto. 13 | 14 | El esquema de funcionamiento del algoritmo de 2 bits puede verse en el siguiente dibujo, donde se indica si el salto se toma o no, y las transiciones de estado se deben a si se ha acertado con la última predicción o no: 15 | 16 | ![](imgs/bm41.png) 17 | 18 | -------------------------------------------------------------------------------- /docs/es/menu-ver.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: es 4 | id: menu-ver 5 | title: Menú ver 6 | prev: menu-archivo.html 7 | next: menu-configurar.html 8 | --- 9 | 10 | Contiene las opciones de visualización del programa. 11 | 12 | 13 | ### Bloques Básicos 14 | 15 | Habilita la opción de colorear los bloques básicos en el código. 16 | 17 | 18 | ### Barras de Herramientas 19 | 20 | Permite seleccionar qué barras de herramientas se ven y cuáles no. Hay dos barras de herramientas definidas: 21 | 22 | * La barra **Estándar**, que contiene las opciones básicas 23 | * La barra de **Ejecución**, que permite realizar las simulaciones 24 | 25 | 26 | ### Código Secuencial 27 | 28 | Muestra/oculta el código secuencial cargado de fichero. 29 | -------------------------------------------------------------------------------- /src/interface/actions/reorder-buffer-actions.ts: -------------------------------------------------------------------------------- 1 | export const NEXT_REORDER_BUFFER_CYCLE = 'NEXT_REORDER_BUFFER_CYCLE'; 2 | export const COLOR_CELL = 'COLOR_CELL'; 3 | 4 | import { stageToString } from '../../core/Superscalar/SuperscalarEnums'; 5 | import { ReorderBuffer } from '../../core/Superscalar/ReorderBuffer'; 6 | 7 | export function nextReorderBufferCycle(data) { 8 | return { 9 | type: NEXT_REORDER_BUFFER_CYCLE, 10 | value: mapReorderBufferData(data) 11 | }; 12 | } 13 | 14 | export function mapReorderBufferData(unit: ReorderBuffer) { 15 | return unit.getVisualData(); 16 | } 17 | 18 | export function colorCell(instructionUid, color) { 19 | return { 20 | type: COLOR_CELL, 21 | value: [instructionUid, color] 22 | }; 23 | } 24 | -------------------------------------------------------------------------------- /docs/es/reorder-buffer.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: es 4 | id: reorder-buffer 5 | title: Reorder Buffer 6 | prev: tabla-de-prediccion-de-salto.html 7 | next: estaciones-de-reserva.html 8 | --- 9 | 10 | Estructura que permite la ejecución fuera de orden (out of order) conservando el orden de graduación (commit) de las instrucciones. 11 | El ROB tiene tantas entradas como la suma de las entradas de todas las ER. 12 | 13 | 14 | ### Campos 15 | 16 | * Nº: Número de entrada en el ROB 17 | * Inst.: Identificador de la instrucción 18 | * Destino: Número de registro destino de la instrucción 19 | * Valor: Resultado de la instrucción 20 | * Direc.: Dirección con la que opera la instrucción (si corresponde) 21 | * Etapa: Etapa actual de la instrucción (ISSUE, EXECUTE, WRITERESULT, COMMIT) -------------------------------------------------------------------------------- /.github/workflows/deploy.yml: -------------------------------------------------------------------------------- 1 | # .github/workflows/deploy.yml 2 | # This workflow constitutes the CD pipeline of generating production releases. 3 | name: build & deploy 4 | on: 5 | push: 6 | tags: 7 | - '*' 8 | jobs: 9 | build: 10 | uses: oxcabe/SIMDE/.github/workflows/build.yml@main 11 | deploy: 12 | name: Deploy 13 | needs: build 14 | runs-on: ubuntu-latest 15 | if: github.ref == 'refs/heads/main' 16 | steps: 17 | - name: Download artifact 18 | uses: actions/download-artifact@v4 19 | with: 20 | name: production-files 21 | path: ./dist 22 | - name: Deploy to gh-pages 23 | uses: peaceiris/actions-gh-pages@v4 24 | with: 25 | deploy_key: ${{ secrets.ACTIONS_DEPLOY_KEY }} 26 | publish_dir: ./dist 27 | -------------------------------------------------------------------------------- /docs/es/modos-de-direccionamiento.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: es 4 | id: modos-de-direccionamiento 5 | title: Modos de direccionamiento 6 | prev: memoria.html 7 | next: registros-de-proposito-general.html 8 | --- 9 | 10 | El repertorio de instrucciones de la máquina sólo permite direccionamiento de memoria indexado de la forma Inm(Rn). 11 | 12 | La dirección se calcula sumando al valor del registro indicado (Rn) el valor inmediato (Inm). Los accesos a memoria se hacen siempre a palabras completas, de tal manera que el valor inmediato se interpreta directamente como un valor de palabra (y no como byte, como suele ser más habitual). 13 | 14 | ## Ejemplo 15 | 16 | // En este ejemplo se accede a la palabra de memoria 5 (3 + 2) para guardar el contenido de R1 17 | ADDI R4 R0 #2 18 | SW R1 3(R4) 19 | 20 | -------------------------------------------------------------------------------- /src/interface/styles/components/LoadContentModalComponent.scss: -------------------------------------------------------------------------------- 1 | @import '../base/variables'; 2 | 3 | .modal-content { 4 | 5 | .modal-body { 6 | display: flex; 7 | } 8 | 9 | textarea { 10 | width: 100%; 11 | height: 70vh; 12 | margin: auto 10px; 13 | 14 | font-family: 'Courier New', Courier, monospace; 15 | } 16 | 17 | .btn.btn-primary { 18 | background: $color-brand; 19 | } 20 | 21 | &-footer { 22 | display: flex; 23 | justify-content: space-between; 24 | } 25 | 26 | &-actions { 27 | flex: 1 0 auto; 28 | } 29 | 30 | &-file_input { 31 | flex: 0 0 auto; 32 | } 33 | 34 | &-errors { 35 | .smd-forms_error { 36 | padding: 0; 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /docs/es/memoria.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: es 4 | id: memoria 5 | title: Memoria 6 | prev: juego-de-instrucciones.html 7 | next: modos-de-direccionamiento.html 8 | --- 9 | 10 | La memoria emplea un esquema ficticio con cachés separadas para datos e instrucciones. 11 | 12 | 13 | ### Memoria Principal 14 | 15 | La memoria principal contiene 1024 palabras de 32 bits. 16 | 17 | 18 | ### Caché de Instrucciones 19 | 20 | La caché de instrucciones está diseñada para contener completamente el programa secuencial (y el programa VLIW si se está empleando), de tal manera que nunca se producen fallos de caché al intentar leer una instrucción. 21 | 22 | 23 | ### Caché da Datos 24 | 25 | La caché de datos genera fallos de lectura de manera aleatoria. El porcentaje de fallos es un parámetro definido por el usuario. 26 | -------------------------------------------------------------------------------- /src/interface/styles/components/main.scss: -------------------------------------------------------------------------------- 1 | @import './App'; 2 | @import './AccessBarComponent'; 3 | @import './CodeComponent'; 4 | @import './FileBarComponent'; 5 | @import './FunctionalUnitComponent'; 6 | @import './GeneralTabComponent'; 7 | @import './IntervalModalComponent'; 8 | @import './LoadModalComponent'; 9 | @import './JumpPredictionComponent'; 10 | @import './LoadContentModalComponent'; 11 | 12 | @import './PrefetchDecoderComponent'; 13 | @import './RegisterComponent'; 14 | @import './RegistersTabComponent'; 15 | @import './ReserveStationComponent'; 16 | @import './ROBMapperComponent'; 17 | @import './ReorderBufferComponent'; 18 | 19 | @import './BatchResultsComponent'; 20 | @import './SuperscalarConfigModalComponent'; 21 | 22 | @import './Forms'; 23 | @import './Panel'; 24 | @import './Table'; 25 | @import './Tabs'; 26 | -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | # .github/workflows/build.yml 2 | # This workflow constitutes the CI pipeline of building and 3 | # testing the project codebase. 4 | name: build 5 | on: 6 | workflow_call: # Allow reusing this workflow in others 7 | pull_request: 8 | branches: ['**'] 9 | jobs: 10 | build: 11 | name: build 12 | runs-on: ubuntu-latest 13 | steps: 14 | - name: Check out code 15 | uses: actions/checkout@v4 16 | - name: Setup pnpm 17 | uses: pnpm/action-setup@v4.1.0 18 | - name: Setup Node.js 19 | uses: actions/setup-node@v4 20 | with: 21 | node-version: 20.19.x 22 | - name: Install packages 23 | run: pnpm install --frozen-lockfile 24 | - name: Run tests 25 | run: pnpm test 26 | - name: Generate production build 27 | run: pnpm build 28 | -------------------------------------------------------------------------------- /docs/es/predicacion-operaciones.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: es 4 | id: predicacion-operaciones 5 | title: Predicación de Operaciones 6 | prev: registro-predicado.html 7 | next: referencias.html 8 | --- 9 | 10 | La Predicación de Operaciones es un mecanismo que permite ejecutar las operaciones de las dos ramas de un Branch simultáneamente para aprovechar los recursos de la máquina. 11 | La Predicación se realiza asociando con el salto dos Registros de Predicado: un registro que se activará si el salto es tomado (Pred. Verdadero) y un registro que se activará si el salto no es tomado (Pred. Falso). 12 | Todas las operaciones llevan un Registro de Predicado asociado. Este registro se emplea para determinar si la instrucción se ejecuta o no. Cuando el salto es evaluado, se anulan aquellas operaciones que correspondan a la rama no tomada del salto. 13 | -------------------------------------------------------------------------------- /docs/en/reorder-buffer.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: en 4 | id: reorder-buffer 5 | title: Reorder Buffer 6 | prev: en/tabla-de-prediccion-de-salto.html 7 | next: en/estaciones-de-reserva.html 8 | --- 9 | 10 | This structure allows the instructions to execute out of order but to commit in order. ROB holds the results of instructions that have finished execution but have not commited, preventing any irrevocable action. 11 | The ROB has as many entries as the amount of entries from all the REs. 12 | 13 | 14 | ### Fields 15 | 16 | * # The identifier of this entry of the ROB 17 | * Inst.: Instruction identifier 18 | * Destin.: The destination register for the instruction 19 | * Value: Result of the instruction 20 | * Addr.: Memory Address used by the instruction (if it's the case) 21 | * Stage: Current stage of the instruction (ISSUE, EXECUTE, WRITERESULT, COMMIT) -------------------------------------------------------------------------------- /src/interface/styles/projectpage/main.scss: -------------------------------------------------------------------------------- 1 | .page { 2 | height: 100%; 3 | } 4 | 5 | .pageproject { 6 | overflow-y: auto; 7 | overflow-x: hidden; 8 | max-height: 90vh; 9 | 10 | & > h1 { 11 | margin-top: 1em; 12 | text-align: center; 13 | font-size: 60px; 14 | } 15 | & > h2 { 16 | margin-top: 1.5em; 17 | text-align: center; 18 | font-size: 50px; 19 | } 20 | & > p { 21 | text-align: center; 22 | margin-top: 1em; 23 | } 24 | & > a { 25 | text-align: center !important; 26 | margin-top: 1.5em; 27 | } 28 | } 29 | 30 | .simdegif { 31 | margin-top: 3em; 32 | display: flex; 33 | 34 | & > img { 35 | box-shadow: 0px 0px 16px 0px rgba(0,0,0,0.75); 36 | border-radius: 4px 4px 4px 4px; 37 | margin: 0 auto; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /docs/es/desenrollado-de-bucles.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: es 4 | id: desenrolladodebucles 5 | title: Desenrollado de bucles 6 | prev: bloques-basicos.html 7 | next: software-pipelining.html 8 | --- 9 | 10 | Técnica consistente en replicar el cuerpo de un bucle varias veces. De esta manera se incrementa el número de operaciones disponibles y se puede aprovechar mejor el ILP. 11 | 12 | Además disminuye la penalización de las operaciones de salto, al disminuir su frecuencia en el código. 13 | 14 | 15 | {%ace lang='asm'%} 16 | // Bucle original 17 | LOOP: 18 | LF F1 (R2) 19 | ADDF F1 F1 F0 20 | ADDI R2 R2 #1 21 | BNE R2 R5 LOOP 22 | {%endace%} 23 | 24 | {%ace lang='asm'%} 25 | // Bucle desenrollado (2 iteraciones en 1) 26 | LOOP: 27 | LF F1 (R2) 28 | ADDF F1 F1 F0 29 | LF F2 1(R2) 30 | ADDF F2 F2 F0 31 | ADDI R2 R2 #2 32 | BNE R2 R5 LOOP 33 | {%endace%} -------------------------------------------------------------------------------- /docs/en/predicacion-operaciones.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: es 4 | id: predicacion-operaciones 5 | title: Predicación de Operaciones 6 | prev: en/registro-predicado.html 7 | next: en/referencias.html 8 | --- 9 | 10 | The Operation Predication is a mechanism that allows to execute simultaneously operations from the true and the false path of a branch. Thus, we can improve the performance of the processor by using some FUs that otherwise will be wasted. 11 | 12 | Each branch has two associated Predicate Registers: one of these will be set to 1 if the branch is taken (True Pred.); the other one will be set to 1 if the branch is not taken (False Pred.). 13 | 14 | All operations have an associated Predicate Register. This register is used to determine if instruction will be executed or not. All the operations corresponding to the not-taken path of a branch will be canceled. 15 | 16 | -------------------------------------------------------------------------------- /src/interface/utils/constants.ts: -------------------------------------------------------------------------------- 1 | export const SUPERSCALAR_CONFIG = { 2 | FUNCTIONAL_UNIT_MIN: 1, 3 | FUNCTIONAL_UNIT_MAX: 10, 4 | LATENCY_MIN: 0, 5 | LATENCY_MAX: 100, 6 | ISSUE_GRADE_MIN: 1, 7 | ISSUE_GRADE_MAX: 16, 8 | CACHE_BLOCKS_MIN: 1, 9 | CACHE_BLOCKS_MAX: 100, 10 | CACHE_LINES_MIN: 1, 11 | CACHE_LINES_MAX: 1024 12 | }; 13 | 14 | export const VLIW_CONFIG = { 15 | FUNCTIONAL_UNIT_MIN: 1, 16 | FUNCTIONAL_UNIT_MAX: 10, 17 | LATENCY_MIN: 0, 18 | LATENCY_MAX: 100, 19 | ISSUE_GRADE_MIN: 1, 20 | ISSUE_GRADE_MAX: 16, 21 | CACHE_BLOCKS_MIN: 1, 22 | CACHE_BLOCKS_MAX: 100, 23 | CACHE_LINES_MIN: 1, 24 | CACHE_LINES_MAX: 1024 25 | }; 26 | 27 | export const BATCH_CONFIG = { 28 | LATENCY_MIN: 0, 29 | LATENCY_MAX: 100, 30 | CACHE_FAIL_PERCENTAGE_MIN: 0, 31 | CACHE_FAIL_PERCENTAGE_MAX: 100 32 | }; 33 | -------------------------------------------------------------------------------- /docs/en/ejemplo-de-codigo-secuencial.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: en 4 | id: ejemplo-de-codigo-secuencial 5 | title: Sequential Code Example 6 | prev: en/fichero-de-codigo-secuencial.html 7 | next: en/estructura-comun.html 8 | --- 9 | 10 | {%ace lang='asm'%} 11 | // SIMDE v0.1 12 | // Author: Iván Castilla Rodríguez 13 | // Utility: Single loop example 14 | // Observations: User must fill a 16-elements array starting at position 50 (R2) of memory. User must also 15 | // put a constant at position 40. The constant will be added to each element from source array and result 16 | // will be put in a destination array at position 70 (R3). 17 | 11 18 | ADDI R2 R0 #50 19 | ADDI R3 R0 #70 20 | ADDI R4 R0 #40 21 | LF F0 (R4) 22 | ADDI R5 R2 #5 23 | LOOP: 24 | LF F1 (R2) 25 | ADDF F1 F1 F0 26 | SF F1 (R3) 27 | ADDI R2 R2 #1 28 | ADDI R3 R3 #1 29 | BNE R2 R5 LOOP 30 | {%endace%} -------------------------------------------------------------------------------- /docs/es/software-pipelining.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: es 4 | id: software-pipelining 5 | title: Software Pipelining 6 | prev: desenrollado-de-bucles.html 7 | next: codigos-ejemplo.html 8 | --- 9 | 10 | Técnica de reorganización de bucles, de tal manera que en cada iteración se construye con operaciones elegidas de distintas iteraciones del bucle original. 11 | 12 | ### Bucle original 13 | 14 | {%ace lang='asm'%} 15 | LOOP: 16 | LF F1 (R2) 17 | ADDF F2 F1 F0 18 | SF F2 (R2) 19 | ADDI R2 R2 #1 20 | BNE R2 R5 LOOP 21 | {%endace%} 22 | 23 | ### Nuevo bucle (faltan los códigos inicial y final) 24 | 25 | {%ace lang='asm'%} 26 | LOOP: 27 | // SF pertenece a dos iteraciones antes 28 | SF F2 (R2) 29 | // ADDF pertenece a una iteración anterior 30 | ADDF F2 F1 F0 31 | // LF es de esta iteración 32 | LF F1 2(R2) 33 | ADDI R2 R2 #1 34 | BNE R2 R5 LOOP 35 | {%endace%} -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2020", 4 | "useDefineForClassFields": true, 5 | "module": "ESNext", 6 | "lib": ["ES2020", "DOM", "DOM.Iterable"], 7 | "skipLibCheck": true, 8 | 9 | /* Bundler mode */ 10 | "moduleResolution": "bundler", 11 | "allowImportingTsExtensions": true, 12 | "resolveJsonModule": true, 13 | "isolatedModules": true, 14 | "noEmit": true, 15 | "jsx": "react-jsx", 16 | 17 | /* Linting */ 18 | 19 | // "strict": true, 20 | // "noUnusedLocals": true, 21 | // "noUnusedParameters": true, 22 | // "noFallthroughCasesInSwitch": true 23 | 24 | /* Types */ 25 | "types": ["vite/client", "vitest/importMeta"], 26 | // "exactOptionalPropertyTypes": true 27 | /* Paths */ 28 | "paths": { 29 | "@/*": ["./src/*"] 30 | } 31 | }, 32 | "include": ["src"] 33 | } 34 | -------------------------------------------------------------------------------- /docs/en/estructura-comun.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: en 4 | id: estructura-comun 5 | title: Shared structure 6 | prev: en/ejemplo-de-codigo-secuencial.html 7 | next: en/juego-de-instrucciones.html 8 | --- 9 | 10 | Both processors, Superscalar and VLIW, have been designed by using a shared basic structure. 11 | 12 | ### Common characteristics 13 | 14 | 1. The processors are intended to work with 32-bit words for both integer and floating point data types. 15 | 16 | 2. The instruction set repertoire, based on MIPS IV. 17 | 18 | 3. Both processors are monoprogrammed. Codes (both, sequential code in superscalar processor and long instruction one in VLIW) starts always at memory address 0. Destination of branches are treated always as absolute addresses. 19 | 20 | ### Common Elements 21 | 22 | * Memory. 23 | 24 | * General Purpose Registers (GPR). 25 | 26 | * Floating Point Registers (FPR). 27 | -------------------------------------------------------------------------------- /docs/es/ejemplo-de-codigo-secuencial.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: es 4 | id: ejemplo-de-codigo-secuencial 5 | title: Ejemplo de código secuencial 6 | prev: fichero-de-codigo-secuencial.html 7 | next: estructura-comun.html 8 | --- 9 | 10 | {%ace lang='asm'%} 11 | // SIMDE v0.1 12 | // Autor: Iván Castilla Rodríguez 13 | // Utilidad: Programa de testeo de SIMDE 14 | // Comentarios: El programa presupone q 15 | // en la posición 50 (R2) de memoria tienes un vector de 16 | // 5 elementos y quieres sumar a cada elemento 17 | // una cantidad fija (en la posición de memoria 18 | // 40). El resultado se coloca a partir 19 | // de la posición 70 (R3) de memoria. 20 | 11 21 | ADDI R2 R0 #50 22 | ADDI R3 R0 #70 23 | ADDI R4 R0 #40 24 | LF F0 (R4) 25 | ADDI R5 R2 #5 26 | LOOP: 27 | LF F1 (R2) 28 | ADDF F1 F1 F0 29 | SF F1 (R3) 30 | ADDI R2 R2 #1 31 | ADDI R3 R3 #1 32 | BNE R2 R5 LOOP 33 | {%endace%} -------------------------------------------------------------------------------- /src/interface/styles/components/Panel.scss: -------------------------------------------------------------------------------- 1 | @import '../base/variables'; 2 | 3 | .panel { 4 | &.panel-default { 5 | height: 100%; 6 | display: flex; 7 | flex-flow: column; 8 | margin-bottom: 0; 9 | overflow-y: auto; 10 | 11 | >.panel-heading { 12 | background-color: $color-brand; 13 | color: white; 14 | padding: 0.5rem 1rem; 15 | font-size: $font-size-m; 16 | font-weight: bold; 17 | } 18 | 19 | .panel-body { 20 | padding: 0; 21 | flex: 1 1 0; 22 | overflow-y: scroll; 23 | } 24 | &.panel--stack { 25 | &>.panel-body { 26 | overflow-y: hidden; 27 | flex: 1 0 auto; 28 | display: flex; 29 | flex-flow: column; 30 | } 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/interface/styles/components/Table.scss: -------------------------------------------------------------------------------- 1 | .smd-table { 2 | &-header { 3 | font-size: 0; 4 | 5 | &_title { 6 | border: 1px solid rgba(0,0,0,.1); 7 | display: inline-block; 8 | font-size: 1rem; 9 | font-weight: bold; 10 | overflow: hidden; 11 | text-align: center; 12 | text-overflow: ellipsis; 13 | width: 20%; 14 | } 15 | } 16 | 17 | &_row { 18 | display: flex; 19 | } 20 | 21 | &_cell { 22 | border: 1px solid rgba(0,0,0,.1); 23 | font-size: .875rem; 24 | min-height: 2rem; 25 | padding: .25rem .5rem; 26 | text-align: center; 27 | overflow: hidden; 28 | text-overflow: ellipsis; 29 | width: 50%; 30 | 31 | &_isover { 32 | background-color: $color-brand; 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /docs/es/menu-ejecutar.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: es 4 | id: menu-ejecutar 5 | title: Menú Ejecutar 6 | prev: menu-configurar.html 7 | next: menu-ventana.html 8 | --- 9 | 10 | Contiene todas las herramientas para realizar las simulaciones. 11 | 12 | ### Iniciar 13 | 14 | Permite comenzar la ejecución continua de la simulación. Si se pulsa mientras está ejecutandose otra simulación, se ofrece la opción de comenzar desde el principio. La ejecución continua sólo se detiene al llegar al final del programa o si encuentra un Break Point. 15 | 16 | 17 | ### Pausa 18 | 19 | Permite pausar una ejecución iniciada en modo continuo. Después puede proseguirse con la ejecución en modo continuo o paso a paso. 20 | 21 | 22 | ### Paso 23 | 24 | Permite comenzar (continuar) una ejecución paso a paso. Cada vez que se hace clic en este botón la simulación avanza un ciclo. 25 | 26 | 27 | ### Parar 28 | 29 | Detiene una ejecución poniendo el reloj a 0. 30 | -------------------------------------------------------------------------------- /docs/es/estructura-comun.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: es 4 | id: estructura-comun 5 | title: Estructura común 6 | prev: ejemplo-de-codigo-secuencial.html 7 | next: juego-de-instrucciones.html 8 | --- 9 | 10 | Tanto la máquina Superescalar como la VLIW diseñadas para este simulador mantienen una estructura básica común. 11 | 12 | 13 | ## Características Comunes 14 | 15 | 1. Ambas máquinas están diseñadas para trabajar con palabras de 32 bits, tanto para los tipos de datos entero y flotante. 16 | 17 | 2. El juego de instrucciones, basado en MIPS IV. 18 | 19 | 3. Las dos máquinas son monoprograma. El código (tanto el secuencial en la máquina superescalar como el de instrucciones largas en la VLIW) siempre se coloca empezando en la dirección 0, por lo que los saltos son siempre a direcciones absolutas. 20 | 21 | 22 | ## Elementos Comunes 23 | 24 | * Memoria. 25 | 26 | * Registros de Propósito General (GPR). 27 | 28 | * Registros de Punto Flotante (FPR). 29 | -------------------------------------------------------------------------------- /src/interface/components/VLIW/VLIWOperationComponent.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | 3 | import { useDrop } from 'react-dnd'; 4 | 5 | 6 | function VLIWOperationComponent(props) { 7 | const [{ canDrop, isOver }, drop] = useDrop(() => ({ 8 | accept: 'INSTRUCTION', 9 | drop: (item, monitor) => { 10 | try { 11 | props.onDropInstruction(item, props.pos); 12 | } catch(e) { 13 | console.log(e.message); 14 | } 15 | }, 16 | 17 | collect: (monitor) => ({ 18 | isOver: monitor.isOver(), 19 | canDrop: monitor.canDrop() 20 | }) 21 | })); 22 | 23 | return ( 24 |
27 | { props.op } 28 |
29 | ) 30 | } 31 | 32 | export default VLIWOperationComponent; 33 | -------------------------------------------------------------------------------- /docs/en/instruction-level-paralelism.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: en 4 | id: instruction-level-paralelism 5 | title: ILP 6 | prev: en/introduccion.html 7 | next: en/menu-archivo.html 8 | --- 9 | 10 | Instruction Level Parallelism is the potential ability of a set of instruction to be executed in parallel. 11 | 12 | There are lots of techniques that try to exploit ILP such as segmentation or Multiple Issue. This simulator illustrates two basic flavours of processors with multiple instruction issue per clock. 13 | 14 | 15 | ## Dynamic Instruction Scheduling 16 | 17 | Instructions are reordered by hardware in order to exploit parallelism. It results in an out-of-order execution. Most of Superscalar processors use this kind of execution . 18 | 19 | 20 | ## Static Instruction Scheduling 21 | 22 | Instructions are reordered by the compiler in order to exploit parallelism. Thus, hardware is significantly reduced. It results in an in-order execution and this is the basic technique that VLIW processors employe. 23 | -------------------------------------------------------------------------------- /src/test/functional/code/multiwayvliw1.ts: -------------------------------------------------------------------------------- 1 | export const codeInput = `// SWMDE v0.1 2 | // Ejemplo simple para poder hacer uso de los predicados en la máquina VLWW 3 | // En memoria, a partir de la pos. 10 deben encontrarse dos números flotantes 4 | // En R32 se supone que viene un parámetro que indica si coger el primero (0) 5 | // el segundo(1) o la suma (resto) y guarda el resultado 6 | // en la pos. de memoria siguiente (12) 7 | // F0 en teoría vale 0 8 | // NUMERO DE INSTRUCCIONES: 9 | 13 10 | // CODIGO: 11 | ADDI R10, R0, #10 12 | ADDI R1, R0, #0 13 | ADDI R2, R0, #1 14 | LF F1, 0(R10) 15 | LF F2, 1(R10) 16 | BNE R32, R1, A 17 | ADDF F3, F1, F0 18 | BEQ R0, R0, FIN 19 | A: 20 | BNE R32, R2, B 21 | ADDF F3, F2, F0 22 | BEQ R0, R0, FIN 23 | B: 24 | ADDF F3, F2, F1 25 | FIN: 26 | SF F3, 2(R10)`; 27 | 28 | export const vliwCodeInput = `11 29 | 2 0 0 0 0 1 0 1 0 30 | 3 2 0 0 0 3 4 0 0 4 4 1 0 31 | 0 32 | 0 33 | 1 5 5 0 0 6 1 2 34 | 2 6 2 0 2 8 5 0 1 7 3 4 35 | 2 9 2 0 4 11 2 1 3 36 | 0 37 | 0 38 | 0 39 | 1 12 4 0 0`; -------------------------------------------------------------------------------- /src/i18n.ts: -------------------------------------------------------------------------------- 1 | import i18n from "i18next"; 2 | import { initReactI18next } from "react-i18next"; 3 | import HttpApi from 'i18next-http-backend'; 4 | import LanguageDetector from 'i18next-browser-languagedetector'; 5 | 6 | 7 | i18n 8 | .use(HttpApi) 9 | .use(LanguageDetector) 10 | .use(initReactI18next) 11 | .init({ 12 | fallbackLng: 'en', 13 | backend: { 14 | loadPath: `${import.meta.env.BASE_URL}locales/{{lng}}/{{ns}}.json` 15 | }, 16 | react: { 17 | useSuspense: true 18 | }, 19 | // have a common namespace used around the full app 20 | ns: ['common'], 21 | defaultNS: 'common', 22 | debug: false, 23 | cache: { 24 | enabled: true 25 | }, 26 | interpolation: { 27 | escapeValue: false, 28 | formatSeparator: ',', 29 | format: function (value, format) { 30 | if (format === 'uppercase') { 31 | return value.toUpperCase(); 32 | } 33 | return value; 34 | } 35 | } 36 | }); 37 | 38 | export default i18n; 39 | -------------------------------------------------------------------------------- /docs/es/estaciones-de-reserva.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: es 4 | id: estaciones-de-reserva 5 | title: Estaciones de reserva 6 | prev: reorder-buffer.html 7 | next: calculo-de-direcciones.html 8 | --- 9 | 10 | 11 | Estructura en la que permanecen las instrucciones mientras esperan por sus operandos o se ejecutan en la U. F. correspondiente. 12 | Tienen tantas entradas como una más que el número de etapas de la U.F. correspondiente multiplicada por el número de U.F. de ese tipo que haya. 13 | 14 | 15 | ### Campos 16 | 17 | * Inst.: Identificador de la instrucción 18 | * Qj: Disponibilidad del primer operando. -1 indica que el valor se encuentra en Vj; otro valor indica la posición del ROB donde se está procesando el operando. 19 | * Vj: Valor del primer operando si (Qj = -1). 20 | * Qk: Disponibilidad del segundo operando. -1 indica que el valor se encuentra en Vk; otro valor indica la posición del ROB donde se está procesando el operando. 21 | * Vk: Valor del segundo operando si (Qk = -1). 22 | * A: Dirección de memoria 23 | * ROB: Posición del ROB donde está esta instrucción 24 | -------------------------------------------------------------------------------- /src/core/VLIW/LargeInstructions.ts: -------------------------------------------------------------------------------- 1 | import { VLIWOperation } from './VLIWOperation'; 2 | 3 | export class LargeInstruction { 4 | 5 | private _operations: VLIWOperation[]; 6 | private _breakPoint: boolean; 7 | 8 | constructor() { 9 | this._operations = []; 10 | this._breakPoint = false; 11 | } 12 | 13 | get operations(): VLIWOperation[] { 14 | return this._operations; 15 | } 16 | 17 | public getOperation(index: number): VLIWOperation { 18 | if (index > this._operations.length) { 19 | throw new Error('Index out of bounds at operations'); 20 | } 21 | return this._operations[index]; 22 | } 23 | 24 | public getVLIWOperationsNumber(): number { 25 | return this._operations.length; 26 | } 27 | 28 | public setBreakPoint(value: boolean) { 29 | this._breakPoint = value; 30 | } 31 | 32 | public getBreakPoint(): boolean { 33 | return this._breakPoint; 34 | } 35 | 36 | addOperation(operation: VLIWOperation) { 37 | this._operations.push(operation); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/test/functional/Superscalar/r0inmutable.spec.ts: -------------------------------------------------------------------------------- 1 | import { expect, beforeEach, test } from 'vitest' 2 | import { Code } from '../../../core/Common/Code'; 3 | import { Superscalar } from '../../../core/Superscalar/Superscalar'; 4 | import { SuperscalarStatus } from '../../../core/Superscalar/SuperscalarEnums'; 5 | import { code } from '../code/r0inmutable'; 6 | 7 | 8 | const context: { code: Code, machine: Superscalar } = { code: null, machine: null }; 9 | 10 | beforeEach(() => { 11 | context.code = new Code(); 12 | context.machine = new Superscalar(); 13 | context.machine.init(true); 14 | }); 15 | 16 | test('Register R0 is inmutable', t => { 17 | // Execute code 18 | context.code.load(code); 19 | context.machine.code = context.code; 20 | while (context.machine.tic() !== SuperscalarStatus.SUPER_ENDEXE) { } 21 | 22 | // Check R1 value 23 | expect(context.machine.getGpr(1)).toBe(0); 24 | 25 | // Check where the program counter is 26 | expect(context.machine.pc).toBe(2); 27 | 28 | // Check the number of cycles are correct 29 | expect(context.machine.status.cycle).toBe(6); 30 | }) -------------------------------------------------------------------------------- /docs/es/barra-de-herramientas-estandar.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: es 4 | id: barra-de-herramientas-estandar 5 | title: Barra de herramientas estándar 6 | prev: menu-ayuda.html 7 | next: barra-de-herramientas-de-ejecucion.html 8 | --- 9 | 10 | Contiene las opciones más comunes del programa. 11 | 12 | ![](imgs/bm2_result.png) 13 | 14 | ![](imgs/bm3_result.png) Permite abrir un fichero con código secuencial. 15 | 16 | ![](imgs/bm4_result.png) Habilita la opción de colorear los bloques básicos en el código. 17 | 18 | ![](imgs/bm5_result.png) Muestra/oculta el código secuencial cargado de fichero. 19 | 20 | ![](imgs/bm6_result.png) Abre la ventana de Configuración de la Máquina Superescalar, con la que se pueden modificar sus parámetros más importantes. 21 | 22 | ![](imgs/bm7_result.png) Abre la ventana de Configuración de la Máquina VLIW, con la que se pueden modificar sus parámetros más importantes. 23 | 24 | ![](imgs/bm8_result.png) Permite establecer el porcentaje de fallos de caché de datos al realizar una instrucción de carga (LOAD). 0 significa que no habrá ningún fallo y 100 significa que todos los accesos producen fallo. -------------------------------------------------------------------------------- /src/test/functional/code/bucle2.ts: -------------------------------------------------------------------------------- 1 | export const codeInput = `// SWMDE v1.0 2 | // Autor: Iván Castilla Rodríguez 3 | // Utilidad: Programa de testeo de SWMDE 4 | // Comentarios: El programa presupone q en la posición 50 (R2) de memoria tienes 5 | // un vector de de 16 elementos y quieres sumar a cada elemento una cantidad 6 | // fija (en la posición de memoria 40). El resultado se coloca a partir de la 7 | // posición 70 (R3) de memoria. 8 | // Este fichero es el mismo bucle de "bucle.pla" pero desenrollado para que en 9 | // cada iteración se hagan dos pasadas del bucle 10 | // 11 | 14 12 | ADDI R2 R0 #50 13 | ADDI R3 R0 #70 14 | ADDI R4 R0 #40 15 | LF F0 (R4) 16 | ADDI R5 R2 #16 17 | LOOP: 18 | LF F1 (R2) 19 | LF F2 1(R2) 20 | ADDF F1 F1 F0 21 | ADDF F2 F2 F0 22 | SF F1 (R3) 23 | SF F2 1(R3) 24 | ADDI R2 R2 #2 25 | ADDI R3 R3 #2 26 | BNE R2 R5 LOOP`; 27 | 28 | export const vliwCodeInput = `15 29 | 2 0 0 0 0 2 0 1 0 30 | 3 1 0 0 0 4 0 1 0 3 4 0 0 31 | 2 5 4 0 0 6 4 1 0 32 | 0 33 | 0 34 | 0 35 | 2 7 2 0 0 8 2 1 0 36 | 0 37 | 0 38 | 0 39 | 2 9 4 0 0 10 4 1 0 40 | 0 41 | 1 11 0 0 0 42 | 1 13 5 0 0 2 1 2 43 | 1 12 0 1 0`; -------------------------------------------------------------------------------- /src/test/functional/code/bucle.ts: -------------------------------------------------------------------------------- 1 | export const codeInput = `// SWMDE v0.1 2 | // Autor: Iván Castilla Rodríguez 3 | // Utilidad: Programa de testeo de SWMDE 4 | // Comentarios: El programa presupone q en la posición 50 (R2) de memoria tienes un vector de 5 | // 16 elementos y quieres sumar a cada elemento una cantidad fija (en la posición de memoria 6 | // 40). El resultado se coloca a partir de la posición 70 (R3) de memoria. 7 | 11 8 | ADDI R2 R0 #50 9 | ADDI R3 R0 #70 10 | ADDI R4 R0 #40 11 | LF F0 (R4) 12 | ADDI R5 R2 #16 13 | LOOP: 14 | LF F1 (R2) 15 | ADDF F1 F1 F0 16 | SF F1 (R3) 17 | ADDI R2 R2 #1 18 | ADDI R3 R3 #1 19 | BNE R2 R5 LOOP`; 20 | 21 | export const vliwCodeInput = `15 22 | 2 0 0 0 0 2 0 1 0 23 | 3 1 0 0 0 4 0 1 0 3 4 0 0 24 | 1 5 4 0 0 25 | 0 26 | 0 27 | 0 28 | 1 6 2 0 0 29 | 1 8 0 0 0 30 | 0 31 | 0 32 | 1 7 4 1 0 33 | 0 34 | 0 35 | 1 10 5 0 0 2 1 2 36 | 1 9 0 1 0`; 37 | 38 | export const vecContent = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]; 39 | export const sumContent = 0.5; 40 | export const resultContent = [1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5 ,8.5, 9.5, 10.5, 11.5, 12.5, 13.5, 14.5, 15.5, 16.5]; -------------------------------------------------------------------------------- /docs/es/maquina-vliw.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: es 4 | id: maquina-vliw 5 | title: Máquina vliw 6 | prev: calculo-de-direcciones.html 7 | next: nat-gpr-fpr.html 8 | --- 9 | 10 | ![](imgs/bm42.png) 11 | 12 | Características 13 | 14 | 1. Hardware extremadamente simple. 15 | 16 | 2. Emisión de una instrucción larga por ciclo 17 | 18 | 3. La instrucción tiene tantas operaciones y de igual tipo que el número de UF que haya. 19 | 20 | 4. Emplea operaciones predicadas. 21 | 22 | 23 | ### Componentes 24 | 25 | * **Nat(GPR)**: Bits de NaT (Not a Thing). Se ponen a TRUE cuando el registro de propósito general asociado es destino de una operación de LOAD que tuvo un fallo de caché. 26 | 27 | * **NaT (FPR)**: Bits de NaT (Not a Thing). Se ponen a TRUE cuando el registro de punto flotante asociado es destino de una operación de LOAD que tuvo un fallo de caché. 28 | 29 | * **Reg. Pred.**: Registros de Predicado. 30 | 31 | * **U.F.**: Unidades Funcionales 32 | 33 | En la máquina VLIW se denomina "operación" a las instrucciones del código secuencial (ADDI, LF...). En general, se entenderá por "instrucción" la instrucción larga compuesta de operaciones. -------------------------------------------------------------------------------- /src/interface/components/Superscalar/PrefetchDecoderComponent.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import { useTranslation } from 'react-i18next'; 3 | 4 | export function PrefetchDecoderComponent(props) { 5 | const [t, i18n] = useTranslation(); 6 | 7 | return ( 8 |
9 |
10 | {t(props.title)}
11 |
12 |
13 | { 14 | props.data && props.data.map((element, i) => 15 |
16 |
{element != null ? element.id : ` `}
17 |
) 18 | } 19 |
20 |
21 |
); 22 | } 23 | 24 | 25 | export default PrefetchDecoderComponent; 26 | -------------------------------------------------------------------------------- /docs/_book/gitbook/gitbook-plugin-search/search.css: -------------------------------------------------------------------------------- 1 | /* 2 | This CSS only styled the search results section, not the search input 3 | It defines the basic interraction to hide content when displaying results, etc 4 | */ 5 | #book-search-results .search-results { 6 | display: none; 7 | } 8 | #book-search-results .search-results ul.search-results-list { 9 | list-style-type: none; 10 | padding-left: 0; 11 | } 12 | #book-search-results .search-results ul.search-results-list li { 13 | margin-bottom: 1.5rem; 14 | padding-bottom: 0.5rem; 15 | /* Highlight results */ 16 | } 17 | #book-search-results .search-results ul.search-results-list li p em { 18 | background-color: rgba(255, 220, 0, 0.4); 19 | font-style: normal; 20 | } 21 | #book-search-results .search-results .no-results { 22 | display: none; 23 | } 24 | #book-search-results.open .search-results { 25 | display: block; 26 | } 27 | #book-search-results.open .search-noresults { 28 | display: none; 29 | } 30 | #book-search-results.no-results .search-results .has-results { 31 | display: none; 32 | } 33 | #book-search-results.no-results .search-results .no-results { 34 | display: block; 35 | } 36 | -------------------------------------------------------------------------------- /docs/en/maquina-superescalar.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: en 4 | id: maquina-superescalar 5 | title: Superescalar Machine 6 | prev: en/unidades-funcionales.html 7 | next: en/unidad-de-prebusqueda.html 8 | --- 9 | 10 | ![](imgs/bm40.png) 11 | 12 | ### Characteristics 13 | 14 | 1. Control of the processor based on Tomasulo's algorithm. 15 | 16 | 2. The Issue Rate is the most important parameter for this processor. The Issue Rate is the maximum number of instructions issued per cycle (and consequently the maximum number of instructions that may commit per cycle). 17 | 18 | 3. It uses dynamic branch prediction. 19 | 20 | 21 | ### Components 22 | 23 | * **Prefetch**: Prefetch unit. 24 | 25 | * **Decoder**: Decoder Unit 26 | 27 | * **ROB<->GPR**: ROB entry where a General Purpose Register is being processed. 28 | 29 | * **ROB<->FPR**: ROB entry where a Floating Point Register is being processed. 30 | 31 | * **Branch Prediction**: 2-bit Branch Prediction Table. 32 | 33 | * **ROB**: Reorder Buffer. 34 | 35 | * **RE**: Reservation Stations. 36 | 37 | * **FU**: Functional Units. 38 | 39 | * **Address computing ALU**: This unit computes memory addresses. -------------------------------------------------------------------------------- /src/interface/App.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react"; 2 | import {BrowserRouter, Routes, Route } from 'react-router-dom'; 3 | import LandingPageComponent from "./components/LandingPage/LandingPageComponent"; 4 | import ProjectPage from "./components/LandingPage/ProjectPageComponent"; 5 | 6 | import SuperscalarComponent from "./components/Superscalar/SuperscalarComponent"; 7 | import VLIWComponent from "./components/VLIW/VLIWComponent"; 8 | 9 | 10 | const App = () => { 11 | return ( 12 | 13 |
14 | Loading...
}> 15 | 16 | } /> 17 | } /> 18 | } /> 19 | } /> 20 | 21 | 22 | 23 |
24 | ); 25 | } 26 | 27 | export default App; 28 | -------------------------------------------------------------------------------- /src/interface/styles/components/CodeComponent.scss: -------------------------------------------------------------------------------- 1 | .smd-code { 2 | 3 | .smd-table_cell { 4 | width: 20%; 5 | } 6 | 7 | .smd-table_row { 8 | position: relative; 9 | .smd-table_cell:first-child { 10 | box-shadow: inset -4px -4px 0px 0px $color-brand; 11 | padding-left:1rem; 12 | 13 | &:hover { 14 | background-color: $color-brand; 15 | color: $color-text-primary; 16 | cursor: grab; 17 | } 18 | } 19 | } 20 | } 21 | 22 | .smd-breakpoint { 23 | &::after { 24 | background-color: #e60000; 25 | border-radius: 1rem; 26 | box-shadow: 1px 1px rgba(0,0,0,0.2); 27 | content: ''; 28 | display: block; 29 | height: .875rem; 30 | left: 3px; 31 | position: absolute; 32 | top: 50%; 33 | transform: translateY(-50%); 34 | width: .875rem; 35 | } 36 | } 37 | 38 | .blue { 39 | background: #019DEA; 40 | } 41 | .green { 42 | background: #A0C55F; 43 | } 44 | .yellow { 45 | background: #FFD216; 46 | } 47 | .pink { 48 | background: pink; 49 | } 50 | -------------------------------------------------------------------------------- /docs/en/estaciones-de-reserva.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: en 4 | id: estaciones-de-reserva 5 | title: Reserve Stations 6 | prev: en/reorder-buffer.html 7 | next: en/calculo-de-direcciones.html 8 | --- 9 | 10 | 11 | This structure holds the instructions while they are waiting for their operands or they are executing in the corresponding FU. 12 | 13 | Let T be a specific type of FU. There is an associated RE[T] for each type of FU. Let N[T] be the number of FU[T] and let P[T] be the number of pipeline stages of this FU. The number of entries of RE[T] is computed by using the following expression: N[T] * P[T] + 1 14 | 15 | 16 | ### Fields 17 | 18 | * Inst.: Instruction identifier. 19 | * Qj: The ROB entry that will produce the first source operand. A value of -1 indicates that the source operand is already available in Vj. 20 | * Vj: Value of the first source operand if (Qj = -1). 21 | * Qk: The ROB entry that will produce the first source operand. A value of -1 indicates that the source operand is already available in Vk. 22 | * Vk: Value of the first source operand if (Qk = -1). 23 | * A: Memory address. 24 | * ROB: ROB entry where this instruction is being processed. 25 | -------------------------------------------------------------------------------- /src/test/functional/code/bucledoble.ts: -------------------------------------------------------------------------------- 1 | export const codeInput = `// SWMDE v0.1 2 | // Autor: Iván Castilla Rodríguez 3 | // Utilidad: Programa de testeo de SWMDE 4 | // Comentarios: El programa presupone q en la posición 50 (R2) de memoria tienes un vector de 5 | // 5 elementos y quieres sumar a cada elemento una cantidad fija (en la posición de memoria 6 | // 40). El resultado se coloca a partir de la posición 70 (R3) de memoria. 7 | // Además se ha añadido un segundo bucle para poder testear el Multiway branching de la VLWW. 8 | // Este segundo bucle multiplica los elementos del vector por el mismo valor 9 | 18 10 | ADDI R2 R0 #50 11 | ADDI R3 R0 #70 12 | ADDI R4 R0 #40 13 | LF F0 (R4) 14 | ADDI R5 R2 #5 15 | LOOP: 16 | LF F1 (R2) 17 | ADDF F1 F1 F0 18 | SF F1 (R3) 19 | ADDI R2 R2 #1 20 | ADDI R3 R3 #1 21 | BNE R2 R5 LOOP 22 | ADDI R3 R0 #70 23 | ADDI R5 R3 #5 24 | LOOP2: 25 | LF F1 (R3) 26 | MULTF F1 F1 F0 27 | SF F1 (R3) 28 | ADDI R3 R3 #1 29 | BNE R3 R5 LOOP2`; 30 | 31 | export const vliwCodeInput = `10 32 | 2 0 0 0 0 2 0 1 0 33 | 3 1 0 0 0 4 0 1 0 3 4 0 0 34 | 1 5 4 0 0 35 | 0 36 | 1 8 0 0 0 37 | 1 6 2 0 0 38 | 0 39 | 0 40 | 0 41 | 3 9 0 0 0 7 4 0 0 10 5 0 0 2 1 2`; -------------------------------------------------------------------------------- /docs/es/menu-configurar.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: es 4 | id: menu-configurar 5 | title: Menú Configurar 6 | prev: menu-ver.html 7 | next: menu-ejecutar.html 8 | --- 9 | 10 | Contiene las opciones de configuración de las máquinas. 11 | 12 | 13 | ### Configurar Superescalar 14 | 15 | Abre la ventana de Configuración de la Máquina Superescalar, con la que se pueden modificar sus parámetros más importantes. 16 | 17 | ### Configurar VLIW 18 | 19 | Abre la ventana de Configuración de la Máquina Superescalar con la que se puede modificar sus parámetros más importantes. 20 | 21 | 22 | ### Opciones 23 | 24 | Contiene varias opciones del programa: 25 | 26 | * Resetear Máquina al Iniciar: Si se deja marcada, cada vez que se inicie una nueva simulación la memoria y registros de la máquina se ponen a 0. Si no conserva los valores de la última ejecución. 27 | * Chequear Código VLIW: Le indica al programa que chequee el código VLIW en busca de inconsistencias al terminar su diseño. 28 | * % Fallos Caché Datos: Permite establecer el porcentaje de fallos de caché de datos al realizar una instrucción de carga (LOAD). 0 significa que no habrá ningún fallo y 100 significa que todos los accesos producen fallo. -------------------------------------------------------------------------------- /src/interface/components/Common/FileReaderInput_LICENSE.txt: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Kevin Ngo 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /docs/en/maquina-vliw.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: es 4 | id: maquina-vliw 5 | title: Máquina vliw 6 | prev: en/calculo-de-direcciones.html 7 | next: en/nat-gpr-fpr.html 8 | --- 9 | 10 | ![](imgs/bm42.png) 11 | 12 | Characteristics 13 | 14 | 1. It has an extremely simple hardware. 15 | 16 | 2. It issues only a single instruction per cycle. 17 | 18 | 3. The long instruction is composed by as many operations (sequential or "short" instructions) as FU in the system. The type of the operations fits exactly with the FUs type. 19 | 20 | 4. It uses predicated operations. 21 | 22 | 23 | ### Componentes 24 | 25 | * **Nat(GPR)**: Each GPR has an extra bit called NaT (Not a Thing). This bit is set to 1 if a cache miss occurs with a LOAD operation using this register as destination. 26 | 27 | * **NaT (FPR)**: Each FPR has an extra bit called NaT (Not a Thing). This bit is set to 1 if a cache miss occurs with a LOAD operation using this register as destination. 28 | 29 | * **Reg. Pred.**: Predicate Registers. 30 | 31 | * **U.F.**: Functional Units. 32 | 33 | When we're talking about the VLIW processor an "operation" is a sequential instruction (ADDI, LF...). A long instruction composed by operations is called only "instruction". -------------------------------------------------------------------------------- /src/test/functional/code/buclesoft.ts: -------------------------------------------------------------------------------- 1 | export const codeInput = `// SWMDE v0.1 2 | // Autor: Iván Castilla Rodríguez 3 | // Utilidad: Programa de testeo de SWMDE 4 | // Comentarios: El programa presupone q en la posición 50 (R2) de memoria tienes un vector de 5 | // 16 elementos y quieres sumar a cada elemento una cantidad fija (en la posición de memoria 6 | // 40). El resultado se coloca a partir de la posición 70 (R3) de memoria. 7 | // En este caso, al bucle se le ha aplicado una técnica de Software pipelining. 8 | 18 9 | ADDI R2 R0 #50 10 | ADDI R3 R0 #70 11 | ADDI R4 R0 #40 12 | LF F0 (R4) 13 | ADDI R5 R2 #16 14 | // Código de inicialización 15 | LF F1 (R2) 16 | ADDF F2 F1 F0 17 | LF F1 1(R2) 18 | ADDI R2 R2 #2 19 | LOOP: 20 | SF F2 (R3) 21 | ADDF F2 F1 F0 22 | LF F1 (R2) 23 | ADDI R2 R2 #1 24 | ADDI R3 R3 #1 25 | BNE R2 R5 LOOP 26 | // Código de finalización 27 | SF F2 (R3) 28 | ADDF F2 F1 F0 29 | SF F2 1(R3)`; 30 | 31 | export const vliwCodeInput = `18 32 | 2 0 0 0 0 2 0 1 0 33 | 4 1 0 0 0 4 0 1 0 3 4 0 0 5 4 1 0 34 | 0 35 | 0 36 | 0 37 | 2 6 2 1 0 7 4 0 0 38 | 0 39 | 0 40 | 1 8 0 0 0 41 | 3 10 2 1 0 9 4 0 0 11 4 1 0 42 | 0 43 | 0 44 | 2 12 0 0 0 13 0 1 0 45 | 3 16 2 1 2 15 4 0 2 14 5 0 0 9 1 2 46 | 0 47 | 0 48 | 0 49 | 1 17 4 0 0`; -------------------------------------------------------------------------------- /src/core/Superscalar/PrefetchUnit.ts: -------------------------------------------------------------------------------- 1 | import { Instruction } from "../Common/Instruction"; 2 | 3 | export interface PrefetchUnitVisualEntry { 4 | id: number; 5 | value: string; 6 | uid: number; 7 | } 8 | 9 | export class PrefetchUnit { 10 | private _entries: Instruction[] = []; 11 | 12 | public get size() { 13 | return this._size; 14 | } 15 | 16 | public get usage() { 17 | return this._entries.length / this._size; 18 | } 19 | 20 | constructor(private _size: number) {} 21 | 22 | public isFull() { 23 | return this._entries.length >= this._size; 24 | } 25 | 26 | public isEmpty() { 27 | return this._entries.length == 0; 28 | } 29 | 30 | public hasBreakpoint() { 31 | return this._entries.some((entry) => entry.breakPoint); 32 | } 33 | 34 | public add(instruction: Instruction) { 35 | this._entries.push(instruction); 36 | } 37 | 38 | public get(): Instruction { 39 | return this._entries.shift(); 40 | } 41 | 42 | public getId(): number { 43 | return this._entries[0].id; 44 | } 45 | 46 | public getVisualData(): PrefetchUnitVisualEntry[] { 47 | return this._entries.map((inst) => { 48 | return { id: inst.id, value: inst.toString(), uid: inst.uid }; 49 | }); 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /docs/en/menu-ejecutar.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: en 4 | id: menu-ejecutar 5 | title: Execute menu 6 | prev: en/menu-configurar.html 7 | next: en/menu-ventana.html 8 | --- 9 | 10 | Simulations are carried out by using this menu. 11 | 12 | 13 | ### Select Processor 14 | 15 | Use this menu item to select the processor you want to simulate. 16 | 17 | * Select Superscalar 18 | * Select VLIW 19 | 20 | 21 | ### Start 22 | 23 | Click this item to start a continuous simulation. If you use this option during an in-execution simulation, you can restart the simulation. Continuous execution stops when the last instruction is finished or when it finds a Breakpoint. 24 | 25 | 26 | ### Pause 27 | 28 | Click this item to pause a continuous execution. When an execution is paused, you can continue it by pressing "Start" (continuous execution) or "Step" (step by step execution). 29 | 30 | 31 | ### Step 32 | 33 | Click this item to start or continue a step by step execution. Every time you press this button the simulation steps one clock cycle. 34 | 35 | 36 | ### Stop 37 | 38 | Click this item to stop the execution and reset the clock. 39 | 40 | 41 | ### Components 42 | 43 | Use this menu item to view and modify registers and memory from the currently selected processor. -------------------------------------------------------------------------------- /docs/es/instruction-level-paralelism.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: es 4 | id: instruction-level-paralelism 5 | title: ILP 6 | prev: introduccion.html 7 | next: menu-archivo.html 8 | --- 9 | 10 | El Paralelismo a Nivel de Instrucción es la capacidad de un conjunto de instrucciones de poder ser ejecutadas en paralelo. 11 | 12 | Existen numerosas técnicas que intentan explotar esta capacidad, desde la segmentación hasta la emisión de múltiples instrucciones por ciclo. Es precisamente con este último grupo de máquinas con las que trabaja este simulador. 13 | 14 | Existen dos claras vertientes para manejar la emisión múltiple (Multiple Issue), que se ven en los dos puntos siguientes. 15 | 16 | 17 | ## Planificación Dinámica de Instrucciones 18 | 19 | El hardware se encarga de reordenar las instrucciones para aprovechar el paralelismo, con lo que se emplea una ejecución fuera de orden (out_of_order). Las máquinas Superescalares suelen emplear esta técnica. 20 | 21 | 22 | ## Planificación Estática de Instrucciones 23 | 24 | El compilador se encarga de reordenar las instrucciones para aprovechar el paralelismo, con lo que se consigue una gran simplificación del hardware. Emplea ejecución en orden (in_order). Esta es la técnica básica en las máquinas VLIW. 25 | 26 | -------------------------------------------------------------------------------- /docs/es/barra-de-herramientas-de-ejecucion.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: es 4 | id: barra-de-herramientas-de-ejecucion 5 | title: Barra de herramientas de ejecución 6 | prev: barra-de-herramientas-estandar.html 7 | next: ventana-de-instrucciones.html 8 | --- 9 | 10 | Contiene las herramientas que permiten llevar a cabo las simulaciones. 11 | 12 | ![](imgs/bm9.png) 13 | 14 | ![](imgs/bm10_result.png) Permite comenzar la ejecución continua de la simulación. Si se pulsa mientras está ejecutandose otra simulación, se ofrece la opción de comenzar desde el principio. La ejecución continua sólo se detiene al llegar al final del programa o si encuentra un Break Point. 15 | 16 | ![](imgs/bm11_result.png) Permite comenzar (continuar) una ejecución paso a paso. Cada vez que se hace clic en este botón la simulación avanza un ciclo. 17 | 18 | ![](imgs/bm12_result.png) Permite pausar una ejecución iniciada en modo continuo. Después puede proseguirse con la ejecución en modo continuo o paso a paso. 19 | 20 | ![](imgs/bm13_result.png) Detiene una ejecución poniendo el reloj a 0. 21 | 22 | ![](imgs/bm14_result.png) Permite escoger un componente de la máquina para visualizar. 23 | 24 | ![](imgs/bm15_result.png) Permite cambiar la máquina con la que se quiere realizar una simulación. 25 | -------------------------------------------------------------------------------- /src/test/functional/code/bucle3.ts: -------------------------------------------------------------------------------- 1 | export const codeInput = `// SWMDE v1.0 2 | // Autor: Iván Castilla Rodríguez 3 | // Utilidad: Programa de testeo de SWMDE 4 | // Comentarios: El programa presupone q en la posición 50 (R2) de memoria tienes 5 | // un vector de de 16 elementos y quieres sumar a cada elemento una cantidad 6 | // fija (en la posición de memoria 40). El resultado se coloca a partir de la 7 | // posición 70 (R3) de memoria. 8 | // Este fichero es el mismo bucle de "bucle.pla" pero desenrollado para que en 9 | // cada iteración se hagan cuatro pasadas del bucle 10 | // 11 | 20 12 | ADDI R2 R0 #50 13 | ADDI R3 R0 #70 14 | ADDI R4 R0 #40 15 | LF F0 (R4) 16 | ADDI R5 R2 #16 17 | LOOP: 18 | LF F1 (R2) 19 | LF F2 1(R2) 20 | LF F3 2(R2) 21 | LF F4 3(R2) 22 | ADDF F1 F1 F0 23 | ADDF F2 F2 F0 24 | ADDF F3 F3 F0 25 | ADDF F4 F4 F0 26 | SF F1 (R3) 27 | SF F2 1(R3) 28 | SF F3 2(R3) 29 | SF F4 3(R3) 30 | ADDI R2 R2 #4 31 | ADDI R3 R3 #4 32 | BNE R2 R5 LOOP`; 33 | 34 | export const vliwCodeInput = `16 35 | 2 0 0 0 0 2 0 1 0 36 | 3 1 0 0 0 4 0 1 0 3 4 0 0 37 | 2 5 4 0 0 6 4 1 0 38 | 2 7 4 0 0 8 4 1 0 39 | 0 40 | 0 41 | 2 9 2 0 0 10 2 1 0 42 | 2 11 2 0 0 12 2 1 0 43 | 0 44 | 0 45 | 2 13 4 0 0 14 4 1 0 46 | 2 15 4 0 0 16 4 1 0 47 | 0 48 | 1 17 0 0 0 49 | 1 19 5 0 0 2 1 2 50 | 1 18 0 1 0`; -------------------------------------------------------------------------------- /src/test/functional/Superscalar/shift.spec.ts: -------------------------------------------------------------------------------- 1 | import { expect, beforeEach, test } from 'vitest' 2 | import { Code } from '../../../core/Common/Code'; 3 | import { Superscalar } from '../../../core/Superscalar/Superscalar'; 4 | import { SuperscalarStatus } from '../../../core/Superscalar/SuperscalarEnums'; 5 | import { codeInput, resultContent } from "../code/despl"; 6 | 7 | 8 | const context: { code: Code, machine: Superscalar } = { code: null, machine: null }; 9 | 10 | beforeEach(() => { 11 | context.code = new Code(); 12 | context.machine = new Superscalar(); 13 | context.machine.init(true); 14 | }); 15 | 16 | test('despl.pla is executed properly', t => { 17 | // Execute code 18 | context.code.load(codeInput); 19 | context.machine.code = context.code; 20 | while (context.machine.tic() !== SuperscalarStatus.SUPER_ENDEXE) { } 21 | 22 | // Check registers 23 | const resultBase = 1; 24 | const result = context.machine.gpr.content.slice( 25 | resultBase, resultBase + resultContent.length 26 | ); 27 | expect(result).toStrictEqual(resultContent); 28 | 29 | // Check where the program counter is 30 | expect(context.machine.pc).toBe(10); 31 | 32 | // Check the number of cycles are correct 33 | expect(context.machine.status.cycle).toBe(10); 34 | }) -------------------------------------------------------------------------------- /docs/en/ventana-de-instrucciones.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: en 4 | id: ventana-de-instrucciones 5 | title: Instruction Window 6 | prev: en/barra-de-herramientas-de-ejecucion.html 7 | next: en/configurar-parametros-superescalar.html 8 | --- 9 | 10 | The Instruction Window shows the sequential code loaded from a file. 11 | 12 | ![](imgs/bm16_result.png) 13 | The instructions are showed in sequential order. 14 | 15 | The first column shows the instruction number, used as identifier. The instruction labels are showed enclosed by brackets ([label:]) next to the instruction identifier. 16 | 17 | The second column shows the opcode. 18 | 19 | Columns third to fifth show the operands. 20 | 21 | ### Breakpoints 22 | 23 | Double-click on any instruction field sets a Breakpoint. This breakpoint is valid for superscalar execution (VLIW breakpoints are set on long instructions). An instruction with a breakpoint is marked with a red background at the identifier column. You can quit a Breakpoint by double-clicking again on the instruction. 24 | 25 | 26 | ### Hide code 27 | 28 | Double-click on the window title (where file name is showed) to hide the window. To show code window again, go to View => Sequencial Code. 29 | 30 | 31 | ### Basic Blocks 32 | 33 | To differentiate code Basic Blocks go to View => Basic Blocks. -------------------------------------------------------------------------------- /src/interface/components/VLIW/InstructionComponent.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | 3 | import { useDrag } from 'react-dnd'; 4 | 5 | import { OpcodesNames } from '../../../core/Common/Opcodes'; 6 | import { Instruction } from '../../../core/Common/Instruction'; 7 | 8 | 9 | function InstructionComponent(props) { 10 | let loc = props.loc; 11 | 12 | const [{ isDragging }, drag] = useDrag(() => ({ 13 | type: 'INSTRUCTION', 14 | item: { loc }, 15 | 16 | collect: (monitor) => ({ 17 | isDragging: monitor.isDragging() 18 | }) 19 | })) 20 | 21 | return ( 22 |
23 |
{props.instruction.label} {props.loc}
24 |
{OpcodesNames[props.instruction.opcode]}
25 |
{props.instruction.operandsString[0]}
26 |
{props.instruction.operandsString[1]}
27 |
{props.instruction.operandsString[2]}
28 |
29 | ) 30 | } 31 | 32 | export default InstructionComponent; 33 | -------------------------------------------------------------------------------- /src/test/functional/Superscalar/newop.spec.ts: -------------------------------------------------------------------------------- 1 | import { expect, beforeEach, test } from 'vitest' 2 | import { Code } from '../../../core/Common/Code'; 3 | import { Superscalar } from '../../../core/Superscalar/Superscalar'; 4 | import { SuperscalarStatus } from '../../../core/Superscalar/SuperscalarEnums'; 5 | import { codeInput, resultContent } from "../code/nuevaOp"; 6 | 7 | 8 | const context: { code: Code, machine: Superscalar } = { code: null, machine: null }; 9 | 10 | beforeEach(() => { 11 | context.code = new Code(); 12 | context.machine = new Superscalar(); 13 | context.machine.init(true); 14 | }); 15 | 16 | test('nuevaOp.pla is executed properly', t => { 17 | // Execute code 18 | context.code.load(codeInput); 19 | context.machine.code = context.code; 20 | while (context.machine.tic() !== SuperscalarStatus.SUPER_ENDEXE) { } 21 | 22 | // Check registers 23 | const resultBase = 2; 24 | const result = context.machine.gpr.content.slice( 25 | resultBase, resultBase + resultContent.length 26 | ); 27 | expect(result).toStrictEqual(resultContent); 28 | 29 | // Check where the program counter is 30 | expect(context.machine.pc).toBe(7); 31 | 32 | // Check the number of cycles are correct 33 | expect(context.machine.status.cycle).toBe(14); 34 | 35 | }) -------------------------------------------------------------------------------- /src/core/Common/Memory.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Returns an Error when target method is called with 3 | * a non-positive `address: number` argument. 4 | */ 5 | export const forcePositiveAddresses = (address: number): Error | undefined => { 6 | if (address < 0) { 7 | return Error("Negative numbers are invalid as addresses"); 8 | } 9 | }; 10 | 11 | export class Memory implements Iterable { 12 | private readonly data: number[]; 13 | 14 | constructor(size: number) { 15 | // Initialize clean data array with `size` Datum slots. 16 | this.data = Array(size).fill(0); 17 | } 18 | 19 | // Memory iterator 20 | [Symbol.iterator](): IterableIterator { 21 | return this.data.values(); 22 | } 23 | 24 | /** 25 | * Memory size as the amount of datum slots in memory. 26 | * @returns memory size as a number. 27 | */ 28 | public get size(): number { 29 | return this.data.length; 30 | } 31 | 32 | public getData(address: number): Error | number { 33 | const error = forcePositiveAddresses(address); 34 | if (error) return error; 35 | 36 | return this.data[address]; 37 | } 38 | 39 | public setData(address: number, value: number): Error | undefined { 40 | const error = forcePositiveAddresses(address); 41 | if (error) return error; 42 | 43 | this.data[address] = value; 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /docs/es/maquina-superescalar.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: es 4 | id: maquina-superescalar 5 | title: Máquina superescalar 6 | prev: unidades-funcionales.html 7 | next: unidad-de-prebusqueda.html 8 | --- 9 | 10 | ![](imgs/bm40.png) 11 | 12 | Características 13 | 14 | 1. Control de la máquina basado en el algoritmo de Tomasulo 15 | 16 | 2. El parámetro más importante de esta máquina es el Grado de Emisión (nos referiremos a este parámetro simplemente como Emisión a partir de ahora), que es el número máximo de instrucciones que pueden emitirse por ciclo, pero también el número máximo de instrucciones que pueden graduarse (commit) por ciclo. 17 | 18 | 3. Emplea predicción dinámica de saltos. 19 | 20 | 21 | ### Componentes 22 | 23 | * **Prefetch**: Unidad de prebúsqueda de instrucciones. 24 | 25 | * **Decoder**: Decodificador de las instrucciones 26 | 27 | * **ROB<->GPR**: Posición del ROB donde se está procesando un registro de propósito general 28 | 29 | * **ROB<->FPR**: Posición del ROB donde se está procesando un registro de punto flotante 30 | 31 | * **Predicción Salto**: Tabla de predicción de salto 32 | 33 | * **ROB**: Reorder Buffer 34 | 35 | * **E.R.**: Estaciones de Reserva 36 | 37 | * **U.F.**: Unidades Funcionales 38 | 39 | * **ALU de cálculo de direcciones**: Unidad para calcular las direcciones de las instrucciones de memoria 40 | -------------------------------------------------------------------------------- /src/integration/machine-integration.ts: -------------------------------------------------------------------------------- 1 | import { ContentIntegration } from './content-integration'; 2 | 3 | export abstract class MachineIntegration { 4 | 5 | public contentIntegration: ContentIntegration; 6 | 7 | abstract loadCode: (code: any) => void; 8 | 9 | abstract makeBatchExecution: () => void; 10 | 11 | abstract play: () => void; 12 | 13 | abstract pause: () => void; 14 | 15 | abstract stop: () => void; 16 | 17 | abstract stepBack: () => void; 18 | 19 | abstract stepForward: () => void; 20 | 21 | abstract setBatchMode: (...config) => void; 22 | 23 | abstract setMemory: (data: number[]) => void; 24 | abstract setFpr: (data: number[]) => void; 25 | abstract setGpr: (data: number[]) => void; 26 | 27 | calculateSpeed() { 28 | let speed = parseInt((document.getElementById('velocidad')as HTMLInputElement).value, 10); 29 | 30 | const defaultStep = 2000; 31 | return speed ? defaultStep / speed : 0; 32 | } 33 | 34 | calculateStandardDeviation(average, values): number { 35 | const diffs = values.map((value) => value - average); 36 | const squareDiffs = diffs.map(diff => diff * diff); 37 | 38 | const averageSquareDiff = squareDiffs.reduce((a,b) => a + b) / squareDiffs.length; 39 | 40 | return Math.sqrt(averageSquareDiff); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /CITATION.cff: -------------------------------------------------------------------------------- 1 | # This CITATION.cff file was generated with cffinit. 2 | # Visit https://bit.ly/cffinit to generate yours today! 3 | 4 | cff-version: 1.2.0 5 | title: Simulador para Planificación Dinámica y Estática 6 | message: >- 7 | If you use this software, please cite it using the 8 | metadata from this file. 9 | type: software 10 | authors: 11 | - family-names: Castilla Rodríguez 12 | given-names: Iván 13 | email: icasrod@ull.es 14 | orcid: 'https://orcid.org/0000-0003-3933-2582' 15 | affiliation: Universidad de La Laguna 16 | - given-names: Adrián 17 | family-names: Abreu González 18 | email: adrianabreugonzalez@outlook.com 19 | - given-names: Melissa 20 | family-names: Díaz Arteaga 21 | - given-names: Óscar 22 | family-names: Carrasco Benítez 23 | email: me@oxca.be 24 | - given-names: Francesco 25 | family-names: La spina 26 | email: endes@disroot.org 27 | repository-code: 'https://github.com/SIMDE-ULL/SIMDE' 28 | url: 'https://simde-ull.github.io/SIMDE/' 29 | abstract: >- 30 | Educational computer simulator on a mission to 31 | "superscalate" the study of computer architecture 32 | fundamentals. 33 | keywords: 34 | - simulator 35 | - educational 36 | - computer architecture 37 | - superscalar 38 | - VLIW 39 | - instruction level parallelism 40 | - out of order 41 | license: GPL-3.0-only 42 | -------------------------------------------------------------------------------- /src/core/Superscalar/JumpPredictor.ts: -------------------------------------------------------------------------------- 1 | export class JumpPredictor { 2 | _table: number[]; 3 | 4 | public get size(): number { 5 | return this._size; 6 | } 7 | 8 | constructor(private _size: number) { 9 | this._table = new Array(_size); 10 | this._table.fill(0); 11 | } 12 | 13 | public getPrediction(address: number): boolean { 14 | return this._table[address % this._size] > 1; 15 | } 16 | 17 | public updatePrediction(address: number, taken: boolean) { 18 | address = address % this._size; 19 | switch (this._table[address]) { 20 | case 0: 21 | this._table[address] = taken ? 1 : 0; 22 | break; 23 | case 1: 24 | this._table[address] = taken ? 3 : 0; 25 | break; 26 | case 2: 27 | this._table[address] = taken ? 3 : 0; 28 | break; 29 | case 3: 30 | this._table[address] = taken ? 3 : 2; 31 | break; 32 | default: 33 | this._table[address] = 0; 34 | break; 35 | } 36 | } 37 | 38 | public getVisualTable(): string[] { 39 | return this._table.map((value) => { 40 | switch (value) { 41 | case 0: 42 | return "F(00)"; 43 | case 1: 44 | return "F(01)"; 45 | case 2: 46 | return "V(10)"; 47 | case 3: 48 | return "V(11)"; 49 | default: 50 | return "---"; 51 | } 52 | }); 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /src/interface/components/Superscalar/ROBMapperComponent.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react"; 2 | import IntervalModalComponent from "./modal/IntervalModalComponent"; 3 | 4 | export class ROBMapperComponent extends React.Component { 5 | constructor(props: any) { 6 | super(props); 7 | 8 | this.state = {}; 9 | } 10 | 11 | render() { 12 | return ( 13 |
14 |
{this.props.title}
15 |
16 |
17 | { Object.keys(this.props.data).map(index => ( 18 |
22 |
26 | {index} 27 |
28 |
32 | {this.props.data[index]} 33 |
34 |
35 | ))} 36 |
37 |
38 |
39 | ); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /docs/en/unidades-funcionales.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: en 4 | id: unidades-funcionales 5 | title: Functional Units 6 | prev: en/registros-de-punto-flotante.html 7 | next: en/maquina-superescalar.html 8 | --- 9 | 10 | The Functional Units (FU) are the basic unit for the processor execution. 11 | 12 | They are pipelined, with 1 cycle per pipeline stage. Thus, a new instruction (operation of a VLIW processor) enters in the pipeline each cycle unless it has a true dependence with the previous instruction. If this is the case, the entering instruction must be stalled until the previous instruction has finished. The time the instruction is stalled is called Latency and it fits with the number of pipeline stages. 13 | 14 | 15 | ### Types 16 | 17 | * Integer Add: It performs the ADDI and ADD operations, and the address computing for the superscalar processor (the VLIW processor includes this work in the memory FU). 18 | 19 | * Integer Multiplication: It performs the MULT operation. 20 | 21 | * FP Add: It performs the ADDF operation. 22 | 23 | * FP Multiplication: It performs the MULTF operation. 24 | 25 | * Memory: It performs all the memory operations (LW, LF, SW, SF). The VLIW processor adds an ALU for address computing into this unit. 26 | 27 | * Branch: It performs all branch operations. It evaluates conditions and change the PC (if it's necessary). Branch Prediction Table in superscalar processor is handled by this unit too). 28 | -------------------------------------------------------------------------------- /src/test/functional/Superscalar/speculativenosideeffects.spec.ts: -------------------------------------------------------------------------------- 1 | import { expect, beforeEach, test } from 'vitest' 2 | import { Code } from '../../../core/Common/Code'; 3 | import { Superscalar } from '../../../core/Superscalar/Superscalar'; 4 | import { SuperscalarStatus } from '../../../core/Superscalar/SuperscalarEnums'; 5 | import { codeInput } from '../code/speculativenosideeffects'; 6 | 7 | 8 | const context: { code: Code, machine: Superscalar } = { code: null, machine: null }; 9 | 10 | beforeEach(() => { 11 | context.code = new Code(); 12 | context.machine = new Superscalar(); 13 | context.machine.init(true); 14 | }); 15 | 16 | test('Speculative execution has no side effects', t => { 17 | // Execute code 18 | context.code.load(codeInput); 19 | context.machine.code = context.code; 20 | while (context.machine.tic() !== SuperscalarStatus.SUPER_ENDEXE) { } 21 | 22 | // Check R5 value 23 | expect(context.machine.getGpr(5)).toBe(0); 24 | 25 | // Check memory pos 5 value 26 | expect(Array.from(context.machine.memory)[5]).toBe(0); 27 | 28 | // Check F1 value 29 | expect(context.machine.getFpr(1)).toBe(0); 30 | 31 | // Check jump prediction table 32 | expect(context.machine.jumpPrediction.getPrediction(7)).toBe(false); 33 | 34 | // Check where the program counter is 35 | expect(context.machine.pc).toBe(9); 36 | 37 | // Check the number of cycles are correct 38 | expect(context.machine.status.cycle).toBe(30); 39 | }) -------------------------------------------------------------------------------- /docs/es/ventana-de-instrucciones.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: es 4 | id: ventana-de-instrucciones 5 | title: Ventana de instrucciones 6 | prev: barra-de-herramientas-de-ejecucion.html 7 | next: configurar-parametros-superescalar.html 8 | --- 9 | 10 | La Ventana de Instrucciones permite visualizar el código secuencial cargado desde un fichero. 11 | 12 | ![](imgs/bm16_result.png) 13 | 14 | Las instrucciones se muestran en orden secuencial. 15 | 16 | En la primera columna aparece el número de orden de la instrucción, que servirá como Identificador. También aparecen en esta columna las etiquetas entre corchetes ([etiqueta:]) a continuación del número de instrucción. 17 | 18 | La segunda columna es el código de la operación (opcode). 19 | 20 | Las siguientes columnas son los operandos. 21 | 22 | 23 | ### Breakpoints 24 | 25 | Haciendo doble clic sobre cualquier campo de la instrucción se establece un Breakpoint válido para la ejecución superescalar (los Breakpoints de la máquina VLIW se indican sobre las instrucciones largas). El breakpoint se indica con el color rojo en la columna del Identificador. Para quitar el Breakpoint basta con volver a hacer doble clic. 26 | 27 | 28 | ### Ocultar el código 29 | 30 | Si se hace doble clic en el título con el nombre del fichero, se ocultará está ventana. Para volver a verla hay que ir al menú Ver => Código Secuencial.. 31 | 32 | 33 | ### Bloques básicos 34 | 35 | Para colorear los Bloques Básicos del código basta con ir al menú Ver => Bloques Básicos. -------------------------------------------------------------------------------- /src/test/functional/VLIW/shift.spec.ts: -------------------------------------------------------------------------------- 1 | import { expect, beforeEach, test } from "vitest"; 2 | import { VLIW } from "../../../core/VLIW/VLIW"; 3 | import { VLIWCode } from "../../../core/VLIW/VLIWCode"; 4 | import { Code } from "../../../core/Common/Code"; 5 | import { VLIWError } from "../../../core/VLIW/VLIWError"; 6 | import { codeInput, vliwCodeInput, resultContent } from "../code/despl"; 7 | 8 | const context: { code: VLIWCode; superscalarCode: Code; machine: VLIW } = { 9 | code: null, 10 | superscalarCode: null, 11 | machine: null, 12 | }; 13 | 14 | beforeEach(() => { 15 | context.code = new VLIWCode(); 16 | context.superscalarCode = new Code(); 17 | context.machine = new VLIW(); 18 | context.machine.init(true); 19 | }); 20 | 21 | test("Despl.pla is executed properly", () => { 22 | // Load code 23 | context.superscalarCode.load(codeInput); 24 | context.code.load(vliwCodeInput, context.superscalarCode); 25 | context.machine.code = context.code; 26 | 27 | // Execute code 28 | while (context.machine.tic() !== VLIWError.ENDEXE) {} 29 | 30 | // Check where the program counter is 31 | expect(context.machine.pc).toBe(8); 32 | 33 | // Check the result 34 | const resultBaseAddress = 1; 35 | const result = context.machine.gpr.content.slice( 36 | resultBaseAddress, 37 | resultBaseAddress + resultContent.length, 38 | ); 39 | expect(result).toStrictEqual(resultContent); 40 | 41 | // Check the cycles 42 | expect(context.machine.status.cycle).toBe(10); 43 | }); 44 | -------------------------------------------------------------------------------- /docs/es/unidades-funcionales.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: es 4 | id: unidades-funcionales 5 | title: Unidades funcionales 6 | prev: registros-de-punto-flotante.html 7 | next: maquina-superescalar.html 8 | --- 9 | 10 | Las Unidades Funcionales (UF) son las únidades básicas de ejecución de la máquina. 11 | 12 | Son segmentadas, y cada etapa del pipeline dura 1 ciclo exactamente. De esta manera, cada ciclo puede entrar una nueva instrucción a menos que tenga una dependencia verdadera con la instrucción anterior. En ese caso, deberá esperar hasta que la instrucción anterior haya acabado completamente su ejecución. A este tiempo lo denominamos latencia de la UF, y coincide con el número de etapas del pipeline. 13 | 14 | ### Tipos 15 | 16 | * Suma entera: Para efectuar las operaciones ADD y ADDI, y el cálculo de direcciones en la VLIW (en la máquina superescalar esta función se considera integrada en la UF de memoria). 17 | 18 | * Multiplicación entera: Efectúa la operación MULT. 19 | 20 | * Suma flotante: Efectúa la operación ADDF. 21 | 22 | * Multiplicación flotante: Efectúa la operación MULTF. 23 | 24 | * Memoria: Se encarga de todas las operaciones referentes a memoria (LW, SW, LF, SF). En la máquina Superescalar se considera que tiene integrada una ALU para el cálculo de direcciones, mientras que en la VLIW sólo representa el tiempo de acceso a la memoria 25 | 26 | * Salto: Se encarga de las operaciones de salto, evaluando las condiciones y cambiando el PC (y la tabla de predicción en la máquina Superescalar). -------------------------------------------------------------------------------- /docs/_book/gitbook/gitbook-plugin-search/search-engine.js: -------------------------------------------------------------------------------- 1 | require([ 2 | 'gitbook', 3 | 'jquery' 4 | ], function(gitbook, $) { 5 | // Global search objects 6 | var engine = null; 7 | var initialized = false; 8 | 9 | // Set a new search engine 10 | function setEngine(Engine, config) { 11 | initialized = false; 12 | engine = new Engine(config); 13 | 14 | init(config); 15 | } 16 | 17 | // Initialize search engine with config 18 | function init(config) { 19 | if (!engine) throw new Error('No engine set for research. Set an engine using gitbook.research.setEngine(Engine).'); 20 | 21 | return engine.init(config) 22 | .then(function() { 23 | initialized = true; 24 | gitbook.events.trigger('search.ready'); 25 | }); 26 | } 27 | 28 | // Launch search for query q 29 | function query(q, offset, length) { 30 | if (!initialized) throw new Error('Search has not been initialized'); 31 | return engine.search(q, offset, length); 32 | } 33 | 34 | // Get stats about search 35 | function getEngine() { 36 | return engine? engine.name : null; 37 | } 38 | 39 | function isInitialized() { 40 | return initialized; 41 | } 42 | 43 | // Initialize gitbook.search 44 | gitbook.search = { 45 | setEngine: setEngine, 46 | getEngine: getEngine, 47 | query: query, 48 | isInitialized: isInitialized 49 | }; 50 | }); -------------------------------------------------------------------------------- /src/interface/actions/stats-actions.ts: -------------------------------------------------------------------------------- 1 | export const NEXT_TOTAL_COMMITED = "NEXT_TOTAL_COMMITED"; 2 | export const NEXT_INSTRUCTIONS_COMMITED = "NEXT_INSTRUCTIONS_COMMITED"; 3 | export const NEXT_UNITS_OCUPATION = "NEXT_UNITS_OCUPATION"; 4 | export const NEXT_STATUSES_COUNT = "NEXT_STATUSES_COUNT"; 5 | export const NEXT_INSTRUCTIONS_STATUSES_AVERAGE_CYCLES = 6 | "NEXT_INSTRUCTIONS_STATUSES_AVERAGE_CYCLES"; 7 | export const SET_CYCLES_PER_REPLICATION = "SET_CYCLES_PER_REPLICATION"; 8 | 9 | export function nextInstructionsStatusesAverageCycles(data) { 10 | return { 11 | type: NEXT_INSTRUCTIONS_STATUSES_AVERAGE_CYCLES, 12 | value: data, 13 | }; 14 | } 15 | 16 | export function nextStatusesCount(data) { 17 | return { 18 | type: NEXT_STATUSES_COUNT, 19 | value: data, 20 | }; 21 | } 22 | 23 | export function nextUnitsUsage(data) { 24 | return { 25 | type: NEXT_UNITS_OCUPATION, 26 | value: data, 27 | }; 28 | } 29 | 30 | export function nextTotalCommited(data) { 31 | return { 32 | type: NEXT_TOTAL_COMMITED, 33 | value: data, 34 | }; 35 | } 36 | 37 | export function nextInstructionsCommited(data) { 38 | return { 39 | type: NEXT_INSTRUCTIONS_COMMITED, 40 | value: data, 41 | }; 42 | } 43 | 44 | export function setCyclesPerReplication(data) { 45 | return { 46 | type: SET_CYCLES_PER_REPLICATION, 47 | value: data, 48 | }; 49 | } 50 | 51 | export function clearCyclesPerReplication() { 52 | return { 53 | type: SET_CYCLES_PER_REPLICATION, 54 | value: [], 55 | }; 56 | } 57 | -------------------------------------------------------------------------------- /src/interface/components/Superscalar/JumpPredictionComponent.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import { useTranslation } from 'react-i18next'; 3 | 4 | export function JumpPredictionComponent(props) { 5 | const [t, i18n] = useTranslation(); 6 | 7 | return ( 8 |
9 |
{t(props.title)}
10 |
11 |
12 | {props.jumpPrediction.map((row, i) => ( 13 |
17 |
21 | {i} 22 |
23 |
27 | {row} 28 |
29 |
30 | ))} 31 |
32 |
33 |
34 | ); 35 | } 36 | 37 | export default JumpPredictionComponent; 38 | -------------------------------------------------------------------------------- /src/test/functional/code/nobucle.ts: -------------------------------------------------------------------------------- 1 | export const codeInput = `// SWMDE v1.0 2 | // Autor: Iván Castilla Rodríguez 3 | // Utilidad: Programa de testeo de SWMDE 4 | // Comentarios: El programa presupone q en la posición 50 (R2) de memoria tienes 5 | // un vector de de 16 elementos y quieres sumar a cada elemento una cantidad 6 | // fija (en la posición de memoria 40). El resultado se coloca a partir de la 7 | // posición 70 (R3) de memoria. 8 | // Este fichero es el mismo bucle de "bucle.pla" pero desenrollado totalmente 9 | // (sin bucle) 10 | // 11 | 52 12 | ADDI R2 R0 #50 13 | ADDI R3 R0 #70 14 | ADDI R4 R0 #40 15 | LF F0 (R4) 16 | LF F1 (R2) 17 | LF F2 1(R2) 18 | LF F3 2(R2) 19 | LF F4 3(R2) 20 | LF F5 4(R2) 21 | LF F6 5(R2) 22 | LF F7 6(R2) 23 | LF F8 7(R2) 24 | LF F9 8(R2) 25 | LF F10 9(R2) 26 | LF F11 10(R2) 27 | LF F12 11(R2) 28 | LF F13 12(R2) 29 | LF F14 13(R2) 30 | LF F15 14(R2) 31 | LF F16 15(R2) 32 | ADDF F1 F1 F0 33 | ADDF F2 F2 F0 34 | ADDF F3 F3 F0 35 | ADDF F4 F4 F0 36 | ADDF F5 F5 F0 37 | ADDF F6 F6 F0 38 | ADDF F7 F7 F0 39 | ADDF F8 F8 F0 40 | ADDF F9 F9 F0 41 | ADDF F10 F10 F0 42 | ADDF F11 F11 F0 43 | ADDF F12 F12 F0 44 | ADDF F13 F13 F0 45 | ADDF F14 F14 F0 46 | ADDF F15 F15 F0 47 | ADDF F16 F16 F0 48 | SF F1 (R3) 49 | SF F2 1(R3) 50 | SF F3 2(R3) 51 | SF F4 3(R3) 52 | SF F5 4(R3) 53 | SF F6 5(R3) 54 | SF F7 6(R3) 55 | SF F8 7(R3) 56 | SF F9 8(R3) 57 | SF F10 9(R3) 58 | SF F11 10(R3) 59 | SF F12 11(R3) 60 | SF F13 12(R3) 61 | SF F14 13(R3) 62 | SF F15 14(R3) 63 | SF F16 15(R3)`; -------------------------------------------------------------------------------- /src/interface/actions/intervals-actions.ts: -------------------------------------------------------------------------------- 1 | 2 | export const ADD_MEMORY_INTERVAL = 'ADD_MEMORY_INTERVAL'; 3 | export const REMOVE_MEMORY_INTERVAL = 'REMOVE_MEMORY_INTERVAL'; 4 | export const ADD_GENERAL_REGISTERS_INTERVAL = 'ADD_GENERAL_REGISTERS_INTERVAL'; 5 | export const REMOVE_GENERAL_REGISTERS_INTERVAL = 6 | 'REMOVE_GENERAL_REGISTERS_INTERVAL'; 7 | export const ADD_FLOATING_REGISTERS_INTERVAL = 8 | 'ADD_FLOATING_REGISTERS_INTERVAL'; 9 | export const REMOVE_FLOATING_REGISTERS_INTERVAL = 10 | 'REMOVE_FLOATING_REGISTERS_INTERVAL'; 11 | 12 | 13 | export function addMemoryInterval(data) { 14 | return { 15 | type: ADD_MEMORY_INTERVAL, 16 | value: data 17 | }; 18 | } 19 | 20 | export function addGeneralRegistersInterval(data) { 21 | return { 22 | type: ADD_GENERAL_REGISTERS_INTERVAL, 23 | value: data 24 | }; 25 | } 26 | 27 | export function addFloatingRegistersInterval(data) { 28 | return { 29 | type: ADD_FLOATING_REGISTERS_INTERVAL, 30 | value: data 31 | }; 32 | } 33 | 34 | export function removeMemoryInterval(data) { 35 | return { 36 | type: REMOVE_MEMORY_INTERVAL, 37 | value: new Set(data) 38 | }; 39 | } 40 | 41 | export function removeGeneralRegistersInterval(data) { 42 | return { 43 | type: REMOVE_GENERAL_REGISTERS_INTERVAL, 44 | value: new Set(data) 45 | }; 46 | } 47 | 48 | export function removeFloatingRegistersInterval(data) { 49 | return { 50 | type: REMOVE_FLOATING_REGISTERS_INTERVAL, 51 | value: new Set(data) 52 | }; 53 | } 54 | -------------------------------------------------------------------------------- /src/test/functional/code/buclesoft2.ts: -------------------------------------------------------------------------------- 1 | export const codeInput = `// SWMDE v0.1 2 | // Autor: Iván Castilla Rodríguez 3 | // Utilidad: Programa de testeo de SWMDE 4 | // Comentarios: El programa presupone q en la posición 50 (R2) de memoria tienes un vector de 5 | // 16 elementos y quieres sumar a cada elemento una cantidad fija (en la posición de memoria 6 | // 40). El resultado se coloca a partir de la posición 70 (R3) de memoria. 7 | // En este caso, al bucle se le ha aplicado una técnica de Software pipelining., y después se 8 | // ha desenrollado para hacer dos iteraciones en cada pasada 9 | 27 10 | ADDI R2 R0 #50 11 | ADDI R3 R0 #70 12 | ADDI R4 R0 #40 13 | LF F0 (R4) 14 | ADDI R5 R2 #16 15 | // Código de inicialización 16 | LF F1 (R2) 17 | LF F3 1(R2) 18 | ADDF F2 F1 F0 19 | ADDF F4 F3 F0 20 | LF F1 2(R2) 21 | LF F3 3(R2) 22 | ADDI R2 R2 #4 23 | LOOP: 24 | SF F2 (R3) 25 | SF F4 1(R3) 26 | ADDF F2 F1 F0 27 | ADDF F4 F3 F0 28 | LF F1 (R2) 29 | LF F3 1(R2) 30 | ADDI R2 R2 #2 31 | ADDI R3 R3 #2 32 | BNE R2 R5 LOOP 33 | // Código de finalización 34 | SF F2 (R3) 35 | SF F4 1(R3) 36 | ADDF F2 F1 F0 37 | ADDF F4 F3 F0 38 | SF F2 2(R3) 39 | SF F4 3(R3)`; 40 | 41 | export const vliwCodeInput = `20 42 | 2 0 0 0 0 2 0 1 0 43 | 4 1 0 0 0 4 0 1 0 3 4 0 0 5 4 1 0 44 | 1 6 4 0 0 45 | 0 46 | 0 47 | 2 7 2 0 0 9 4 0 0 48 | 2 8 2 0 0 10 4 0 0 49 | 0 50 | 0 51 | 1 11 0 0 0 52 | 4 14 2 0 0 15 2 1 0 12 4 0 0 13 4 1 0 53 | 2 16 4 0 0 17 4 1 0 54 | 0 55 | 1 19 0 0 0 56 | 1 18 0 1 0 57 | 5 23 2 0 2 24 2 1 2 21 4 0 2 22 4 1 2 20 5 0 0 10 1 2 58 | 0 59 | 0 60 | 0 61 | 2 25 4 0 0 26 4 1 0`; -------------------------------------------------------------------------------- /src/test/functional/code/recorrelista.ts: -------------------------------------------------------------------------------- 1 | export const codeInput = `// Simde v1.2 2 | // Recorre y suma 3 | // Este ejemplo recorre una lista de elementos ordenados por prioridad y suma el valor que 4 | // contienen ponderándolo con la posición en la lista. Cada elemento E de la lista se 5 | // compone de: 6 | // E[0] contiene el valor del elemento 7 | // E[1] contiene 1 si el valor es ponderado o 0 si el valor no se pondera 8 | // E[2] contiene la dirección del siguiente elemento (-1 para fin de la lista) 9 | // 10 | // Registros empleados: 11 | // - R1 apunta al comienzo de la lista (posición 10 de memoria) 12 | // - R2 es el elemento actual 13 | // - R3 apunta al resultado (posición 9) 14 | // - F0 va a contener el contador de la lista (hay que inicializarlo a 0) 15 | // - F1 contiene un 1 en flotante para incrementar el valor de 0 16 | // - F2 contiene el resultado parcial 17 | 19 18 | ADDI R33 R0 #-1 19 | ADDI R1 R0 #10 20 | ADDI R2 R1 #0 21 | ADDI R3 R0 #9 22 | SW R0 (R3) 23 | LF F0 (R3) 24 | LF F2 (R3) 25 | // Inicializo a 1 F1. Para ello uso la posició 1 de memoria como "puente" 26 | ADDI R10 R0 #1 27 | SW R10 1(R0) 28 | LF F1 1(R0) 29 | LOOP: 30 | LF F4 (R2) 31 | LW R4 1(R2) 32 | BEQ R4 R0 NOOP 33 | MULTF F4 F0 F4 34 | NOOP: 35 | ADDF F2 F2 F4 36 | // Incremento el contador de la lista 37 | ADDF F0 F1 F0 38 | LW R2 2(R2) 39 | BNE R2 R33 LOOP 40 | SF F2 (R3)`; 41 | 42 | // lista = [5, 2, 2, 1] resultado = 5 + 2 + 2 + 1*2 = 12 43 | // #14 #17 #20 44 | export const memContent = [5, 0, 14, 0, 2, 0, 17, 2, 0, 20, 1, 1, -1]; -------------------------------------------------------------------------------- /.github/workflows/deploy-pages.yml: -------------------------------------------------------------------------------- 1 | # Simple workflow for deploying static content to GitHub Pages 2 | name: Deploy static content to Pages 3 | 4 | on: 5 | # Runs on pushes targeting the default branch 6 | push: 7 | branches: ['main'] 8 | 9 | # Allows you to run this workflow manually from the Actions tab 10 | workflow_dispatch: 11 | 12 | # Sets the GITHUB_TOKEN permissions to allow deployment to GitHub Pages 13 | permissions: 14 | contents: read 15 | pages: write 16 | id-token: write 17 | 18 | # Allow one concurrent deployment 19 | concurrency: 20 | group: 'pages' 21 | cancel-in-progress: true 22 | 23 | jobs: 24 | # Single deploy job since we're just deploying 25 | deploy: 26 | environment: 27 | name: github-pages 28 | url: ${{ steps.deployment.outputs.page_url }} 29 | runs-on: ubuntu-latest 30 | steps: 31 | - name: Checkout 32 | uses: actions/checkout@v4 33 | - name: Setup pnpm 34 | uses: pnpm/action-setup@v4.1.0 35 | - name: Set up Node 36 | uses: actions/setup-node@v4 37 | with: 38 | node-version: 20 39 | cache: pnpm 40 | - name: Install dependencies 41 | run: pnpm install --frozen-lockfile 42 | - name: Build 43 | run: pnpm build 44 | - name: Setup Pages 45 | uses: actions/configure-pages@v5 46 | - name: Upload artifact 47 | uses: actions/upload-pages-artifact@v3 48 | with: 49 | # Upload dist folder 50 | path: './dist' 51 | - name: Deploy to GitHub Pages 52 | id: deployment 53 | uses: actions/deploy-pages@v4 54 | -------------------------------------------------------------------------------- /src/test/functional/code/bucle4.ts: -------------------------------------------------------------------------------- 1 | export const codeInput = `// SWMDE v1.0 2 | // Autor: Iván Castilla Rodríguez 3 | // Utilidad: Programa de testeo de SWMDE 4 | // Comentarios: El programa presupone q en la posición 50 (R2) de memoria tienes 5 | // un vector de de 16 elementos y quieres sumar a cada elemento una cantidad 6 | // fija (en la posición de memoria 40). El resultado se coloca a partir de la 7 | // posición 70 (R3) de memoria. 8 | // Este fichero es el mismo bucle de "bucle.pla" pero desenrollado para que en 9 | // cada iteración se hagan ocho pasadas del bucle 10 | // 11 | 32 12 | ADDI R2 R0 #50 13 | ADDI R3 R0 #70 14 | ADDI R4 R0 #40 15 | LF F0 (R4) 16 | ADDI R5 R2 #16 17 | LOOP: 18 | LF F1 (R2) 19 | LF F2 1(R2) 20 | LF F3 2(R2) 21 | LF F4 3(R2) 22 | LF F5 4(R2) 23 | LF F6 5(R2) 24 | LF F7 6(R2) 25 | LF F8 7(R2) 26 | ADDF F1 F1 F0 27 | ADDF F2 F2 F0 28 | ADDF F3 F3 F0 29 | ADDF F4 F4 F0 30 | ADDF F5 F5 F0 31 | ADDF F6 F6 F0 32 | ADDF F7 F7 F0 33 | ADDF F8 F8 F0 34 | SF F1 (R3) 35 | SF F2 1(R3) 36 | SF F3 2(R3) 37 | SF F4 3(R3) 38 | SF F5 4(R3) 39 | SF F6 5(R3) 40 | SF F7 6(R3) 41 | SF F8 7(R3) 42 | ADDI R2 R2 #8 43 | ADDI R3 R3 #8 44 | BNE R2 R5 LOOP`; 45 | 46 | export const vliwCodeInput = `18 47 | 2 0 0 0 0 2 0 1 0 48 | 3 1 0 0 0 4 0 1 0 3 4 0 0 49 | 2 5 4 0 0 6 4 1 0 50 | 2 7 4 0 0 8 4 1 0 51 | 2 9 4 0 0 10 4 1 0 52 | 2 11 4 0 0 12 4 1 0 53 | 2 13 2 0 0 14 2 1 0 54 | 2 15 2 0 0 16 2 1 0 55 | 2 17 2 0 0 18 2 1 0 56 | 2 19 2 0 0 20 2 1 0 57 | 2 21 4 0 0 22 4 1 0 58 | 2 23 4 0 0 24 4 1 0 59 | 2 25 4 0 0 26 4 1 0 60 | 2 27 4 0 0 28 4 1 0 61 | 1 29 0 0 0 62 | 0 63 | 1 31 5 0 0 2 1 2 64 | 1 30 0 0 0`; -------------------------------------------------------------------------------- /src/interface/actions/reserve-station-actions.ts: -------------------------------------------------------------------------------- 1 | export const NEXT_RESERVE_STATION_CYCLE = 'NEXT_RESERVE_STATION_CYCLE'; 2 | 3 | export function nextReserveStationCycle(data) { 4 | return { 5 | type: NEXT_RESERVE_STATION_CYCLE, 6 | value: data.map(element => mapReserveStationEntry(element)) 7 | }; 8 | } 9 | 10 | function mapReserveStationEntry(content: { data: any, size: number }): any { 11 | let data = content.data; 12 | let toReturn = []; 13 | let i; 14 | 15 | const defaultObject = { 16 | instruction: { id: '', value: '', uid: '' }, 17 | Qj: '', 18 | Vj: '', 19 | Qk: '', 20 | Vk: '', 21 | A: '', 22 | ROB: '' 23 | }; 24 | for (i = 0; i < data.length; i++) { 25 | let aux = { ...defaultObject }; 26 | if (data[i] != null) { 27 | aux = { 28 | instruction: { id: '', value: '', uid: '' }, 29 | Qj: data[i].Qj, 30 | Vj: data[i].Vj, 31 | Qk: data[i].Qk, 32 | Vk: data[i].Vk, 33 | A: data[i].A, 34 | ROB: data[i].ROB 35 | }; 36 | if (data[i].instruction != null) { 37 | aux.instruction.id = data[i].instruction.id; 38 | aux.instruction.value = data[i].instruction.value; 39 | aux.instruction.uid = data[i].instruction.uid; 40 | } 41 | } 42 | 43 | toReturn.push(aux); 44 | } 45 | 46 | for (let j = i; j < content.size; j++) { 47 | toReturn.push({ ...defaultObject }); 48 | } 49 | return toReturn; 50 | } 51 | -------------------------------------------------------------------------------- /docs/en/ventana-registros-memoria.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: en 4 | id: ventana-registros-memoria 5 | title: Register and Memory Window 6 | next: en/ventana-simulacion.html 7 | prev: en/configurar-parametros-superescalar.html 8 | --- 9 | 10 | There are two different ways for showing General Purpose or Floating Point Registers and Memory: 11 | 12 | 1. Click on menu Execute => Components and select a component. 13 | 14 | 2. Use the components combo box from the Execution Tool Bar. 15 | 16 | 17 | ![Ventana registro](imgs/bm18_result.png) 18 | 19 | This window allows the user to see a subset of registers (or memory positions) of the current component. 20 | 21 | The first column shows the register index or memory position. The second one shows the value associated to this index/position (floating point values are rounded to 3 decimals). 22 | 23 | There are a set of buttons below the window : 24 | 25 | ![Ventana registro](imgs/bm20_result.png) Click this button to select a subset of registers/positions to show. The selection is making by using a comma-separated list of numbers or intervals (for example: 2,10-15,20). 26 | 27 | ![Ventana registro](imgs/bm21_result.png) Click this button to select a subset of registers/positions to hide. The selection is making by using a comma-separated list of numbers or intervals (for example: 2,10-15,20). 28 | 29 | ![Ventana registro](imgs/bm22_result.png) Click this button to save the changes made in the component. 30 | 31 | ![Ventana registro](imgs/bm23_result.png) Click this button to cancel the changes made in the component. 32 | 33 | ![Ventana registro](imgs/bm24_result.png) Reset all selected values. 34 | -------------------------------------------------------------------------------- /docs/es/fichero-de-codigo-secuencial.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: es 4 | id: fichero-de-codigo-secuencial 5 | title: Fichero de código secuencial 6 | prev: ventana-simulacion.html 7 | next: ejemplo-de-codigo-secuencial.html 8 | --- 9 | 10 | Los Ficheros de Código Secuencial que se emplean como entrada permiten definir de forma sencilla un código secuencial mediante cualquier editor de textos. Todos los ficheros de código deben llevar la extensión .pla 11 | 12 | 13 | ## Características 14 | 15 | El fichero debe cumplir las siguientes características: 16 | * La primera línea del fichero (que no sea un comentario) contiene el número de instrucciones del fichero. 17 | * Cada instrucción debe ponerse en una nueva línea. 18 | * Se permiten como separadores de operandos tabuladores o espacios. 19 | * Las etiquetas se ponen al principio de la línea y deben terminar con ":". 20 | * Los comentarios se indican con "//". De ahí al final de la línea todo es un comentario. 21 | 22 | 23 | ## Instrucciones 24 | 25 | Las instrucciones permitidas están inspiradas en el repertorio MIPS IV. Se emplea la siguiente nomenclatura: 26 | 27 | * Rn Registro de Propósito General n. 28 | Ej. R1, R0... 29 | * Fm Registro de Punto Flotante m. 30 | Ej. F1, F0... 31 | * #n Valor inmediato n. 32 | Ej. #12, #0... 33 | * n(Rm) Dirección de memoria. 34 | Ej. (R1), 3(R4)... 35 | * LAB: Etiqueta destino de un salto. 36 | Ej. LOOP1:, END:... 37 | 38 | 39 | Las instrucciones permitidas son: 40 | * ADDI Rn Rm #i 41 | * ADD Rn Rm Rp 42 | * MULT Rn Rm Rp 43 | * ADDF Fn Fm Fp 44 | * MULTF Fn Fm Fp 45 | * LW Rn i(Rm) 46 | * LF Fn i(Rm) 47 | * SW Rn i(Rm) 48 | * SF Fn i(Rm) 49 | * BNE Rn Rm LAB 50 | * BEQ Rn Rm LAB 51 | -------------------------------------------------------------------------------- /docs/es/ventana-registros-memoria.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: es 4 | id: ventana-registros-memoria 5 | title: Ventana de Registros - Memoria 6 | next: ventana-simulacion.html 7 | prev: configurar-parametros-superescalar.html 8 | --- 9 | 10 | 11 | Para ver los Registros de Propósito General, los de Punto Flotante o la Memoria se pueden emplear dos métodos: 12 | 13 | 1. Ir al menú Ejecutar => Maquina Superescalar/VLIW => Componentes y elegir el componente correspondiente. 14 | 15 | 2. Desde la Barra de Herramientas de Ejecución usar el cuadro combinado de componentes. 16 | 17 | 18 | ![Ventana registro](imgs/bm19.png) 19 | La ventana permite ver un subconjunto de los elementos del componente seleccionado por el usuario. 20 | 21 | La primera columna representa el índice o la posición, y la segunda columna representa el valor de esa posición (por claridad, los números en punto flotante se presentan siempre redondeados a 3 decimales). 22 | 23 | Se presentan una serie de botones en la parte baja de la ventana: 24 | 25 | ![Ventana registro](imgs/bm20_result.png) Permite seleccionar un subconjunto de elementos para mostrar mediante una lista de números o intervalos separados por comas (ej. 2,10-15,20). 26 | 27 | ![Ventana registro](imgs/bm21_result.png)Permite seleccionar un subconjunto de elementos para ocultar mediante una lista de números o intervalos separados por comas (ej. 2,10-15,20). 28 | 29 | ![Ventana registro](imgs/bm22_result.png) Guarda los cambios realizados en el contenido del componente. 30 | 31 | ![Ventana registro](imgs/bm23_result.png) Cancela los cambios realizados en el contenido del componente. 32 | 33 | ![Ventana registro](imgs/bm24_result.png) Pone todos los elementos seleccionados a 0. 34 | -------------------------------------------------------------------------------- /docs/en/fichero-de-codigo-secuencial.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: en 4 | id: fichero-de-codigo-secuencial 5 | title: Sequential Code File 6 | prev: en/ventana-simulacion.html 7 | next: en/ejemplo-de-codigo-secuencial.html 8 | --- 9 | 10 | The input sequential code files allows the user to easily define a sequential code with any text editor. The .pla extension is required for all code files. 11 | 12 | 13 | ### Characteristics 14 | 15 | File must be created with the following characteristics: 16 | * The first line (not a commentary) must contain the number of instructions of code. 17 | * Each instruction must be placed in a new line. 18 | * Operands are separated with blanks or tabs. 19 | * Labels must be placed at the start of the line and always finishes with a ":". 20 | * Commentaries start with "//". From here to the end of the line will be considered as a commentary. 21 | 22 | 23 | ### Instructions 24 | 25 | The instructions are inspired in the MIPS IV repertory. We use the next nomenclature: 26 | 27 | * Rn General Purpose Register n. 28 | f. i. R1, R0... 29 | * Fm Floating Point Register m. 30 | f. i. F1, F0... 31 | * #n Inmediate value n. 32 | f. i. #12, #0... 33 | * n(Rm) Memory address. 34 | f. i. (R1), 3(R4)... 35 | * LAB: Branch destiny label. 36 | f. i. LOOP1:, END:... 37 | 38 | 39 | The allowed instructions are: 40 | * ADDI Rn Rm #i 41 | * ADD Rn Rm Rp 42 | * SUB Rn Rm Rp 43 | * AND Rn Rm Rp 44 | * OR Rn Rm Rp 45 | * NOR Rn Rm Rp 46 | * XOR Rn Rm Rp 47 | * SLLV Rn Rm Rp 48 | * SRLV Rn Rm Rp 49 | * MULT Rn Rm Rp 50 | * ADDF Fn Fm Fp 51 | * SUBF Fn Fm Fp 52 | * MULTF Fn Fm Fp 53 | * LW Rn i(Rm) 54 | * LF Fn i(Rm) 55 | * SW Rn i(Rm) 56 | * SF Fn i(Rm) 57 | * BNE Rn Rm LAB 58 | * BEQ Rn Rm LAB 59 | * BGT Rn Rm LAB -------------------------------------------------------------------------------- /docs/es/juego-de-instrucciones.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: es 4 | id: juego-de-instrucciones 5 | title: Juego de instrucciones 6 | prev: estructura-comun.html 7 | next: memoria.html 8 | --- 9 | 10 | El Juego de Instrucciones (Operaciones en la máquina VLIW) es común a las dos máquinas. Sin embargo hay ligeras diferencias en el comportamiento de algunas de las instrucciones. 11 | 12 | ADDI 13 | Suma Entera con Inmediato sin signo 14 | ADDI Rd, Ro1, #Inm 15 | Rd = Ro1 + Inm 16 | Se opera en la UF de Suma Entera 17 | 18 | ADD 19 | Suma Entera 20 | ADD Rd, Ro1, Ro2 21 | Rd = Ro1 + Ro2 22 | Se opera en la UF de Suma Entera 23 | 24 | MULT 25 | Multiplicación Entera 26 | MULT Rd, Ro1, Ro2 27 | Rd = Ro1 * Ro2 28 | Se opera en la UF de Multiplicación Entera 29 | 30 | ADDF 31 | Suma Punto Flotante 32 | ADDF Fd, Fo1, Fo2 33 | Fd = Fo1 + Fo2 34 | Se opera en la UF de Suma en Punto Flotante 35 | 36 | MULTF 37 | Multiplicación Punto Flotante 38 | MULTF Fd, Fo1, Fo2 39 | Fd = Fo1 * Fo2 40 | Se opera en la UF de Multiplicación en Punto Flotante 41 | 42 | LW 43 | Load Entero 44 | LW Rd, Inm(Ro) 45 | Rd = MEM[Ro + Inm] 46 | Se opera en la UF de Memoria 47 | 48 | LF 49 | Load Flotante 50 | LF Fd, Inm(Ro) 51 | Fd = MEM[Ro + Inm] 52 | Se opera en la UF de Memoria 53 | 54 | SW 55 | Store Entero 56 | SW Ro, Inm(Rd) 57 | MEM[Rd + Inm] = Ro 58 | Se opera en la UF de Memoria 59 | 60 | SF 61 | Store Flotante 62 | SF Fo, Inm(Rd) 63 | MEM[Rd + Inm] = Fo 64 | Se opera en la UF de Memoria 65 | 66 | BNE 67 | Salta si distinto 68 | BNE Ro1, Ro2, Etiqueta 69 | Si (Ro1 != Ro2) 70 | Saltar a instrucción apuntada por Etiqueta 71 | Se opera en la UF de Salto 72 | 73 | BEQ 74 | Salta si igual 75 | BEQ Ro1, Ro2, Etiqueta 76 | Si (Ro1 == Ro2) 77 | Saltar a instrucción apuntada por Etiqueta 78 | Se opera en la UF de Salto -------------------------------------------------------------------------------- /src/interface/styles/components/GeneralTabComponent.scss: -------------------------------------------------------------------------------- 1 | @import '../base/variables'; 2 | 3 | 4 | .smd-general_tab { 5 | width: 100%; 6 | height: 100%; 7 | display: flex; 8 | 9 | &-code { 10 | width: 25%; 11 | } 12 | 13 | &-simulation { 14 | width: 75%; 15 | display: flex; 16 | 17 | &_left { 18 | width: 40%; 19 | height: 100%; 20 | 21 | &--expanded { 22 | width: 80%; 23 | height: 100%; 24 | 25 | & .smd-general_tab-simulation_planificator { 26 | height: 70%; 27 | 28 | & .smd-table-header_title { 29 | width: 8.3%; 30 | 31 | } 32 | 33 | & .id_colum { 34 | width: 5%; 35 | } 36 | } 37 | } 38 | } 39 | 40 | &_center { 41 | width: 40%; 42 | height: 100%; 43 | } 44 | 45 | &_right { 46 | width: 20%; 47 | } 48 | 49 | &_nat_predicate { 50 | display: flex; 51 | width: 100%; 52 | height: 30%; 53 | flex: 1 0 auto; 54 | 55 | & .smd-register { 56 | width: 100%; 57 | height: 100%; 58 | } 59 | } 60 | 61 | &_prefetch_decoder { 62 | height: 25%; 63 | display: flex; 64 | } 65 | 66 | &_mappers { 67 | height: 25%; 68 | display: flex; 69 | } 70 | 71 | &_register_mapper { 72 | flex: 1 0 auto; 73 | } 74 | 75 | &_reorder_buffer { 76 | height: 50%; 77 | } 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /src/interface/reducers/interval.ts: -------------------------------------------------------------------------------- 1 | export function addInterval(state, field, interval) { 2 | 3 | const newVisibleRangeValues = Array.from( 4 | new Set([...state[field].visibleRangeValues, ...interval]) 5 | ).sort((a, b) => +a - +b); 6 | 7 | let newState = { 8 | ...state, 9 | history : state.history.map(historyEntry => { 10 | const newHistoryEntry = { 11 | ...historyEntry 12 | }; 13 | newHistoryEntry[field] = { 14 | ...historyEntry[field], 15 | visibleRangeValues: newVisibleRangeValues 16 | }; 17 | return newHistoryEntry; 18 | }) 19 | }; 20 | newState[field] = { 21 | ...state[field], 22 | visibleRangeValues: Array.from( 23 | new Set([...state[field].visibleRangeValues, ...interval]) 24 | ).sort((a, b) => +a - +b) 25 | }; 26 | 27 | return newState; 28 | } 29 | 30 | export function removeInterval(state, field, interval) { 31 | const newVisibleRangeValues = state[field].visibleRangeValues.filter( 32 | x => !interval.has(x) 33 | ); 34 | let newState = { 35 | ...state, 36 | history : state.history.map(historyEntry => { 37 | const newHistoryEntry = { 38 | ...historyEntry 39 | }; 40 | newHistoryEntry[field] = { 41 | ...historyEntry[field], 42 | visibleRangeValues: newVisibleRangeValues 43 | }; 44 | return newHistoryEntry; 45 | }) 46 | }; 47 | 48 | newState[field] = { 49 | ...state[field], 50 | visibleRangeValues: state[field].visibleRangeValues.filter( 51 | x => !interval.has(x) 52 | ) 53 | }; 54 | 55 | return (state = newState); 56 | } 57 | -------------------------------------------------------------------------------- /docs/en/menu-configurar.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: en 4 | id: menu-configurar 5 | title: Config menu 6 | prev: en/menu-ver.html 7 | next: en/menu-ejecutar.html 8 | --- 9 | 10 | This menu contains utilities to configure processor parameters. 11 | 12 | 13 | ## Superscalar Configuration 14 | 15 | Use this menu item to show the Superscalar Configuration window, that allows to modify the main parameters of the superscalar processor. 16 | 17 | 18 | ## VLIW Configuration 19 | 20 | Use this menu item to show the VLIW Configuration window, that allows to modify the main parameters of the VLIW processor. 21 | 22 | 23 | ## Memory-Registers data 24 | 25 | This menu item allows to load/save the contents of memory and registers from/to a file: 26 | 27 | * Save Mem/Reg to File: Allows the user to save the contents of the memory and registers of the superscalar or the VLIW processor to a file. 28 | * Load Mem/Reg from File: Allows the user to load the contents of the memory and the registers from a file. The user is asked in order to fill only the superscalar processor, only the VLIW one or both. 29 | 30 | 31 | ## VLIW Instructions 32 | 33 | This menu contains some useful options in order to design a VLIW code: 34 | 35 | * Create New VLIW Code: Use this menu item to create a blank VLIW code. 36 | * Load VLIW Code...: Use this menu item to load a VLIW code from a file. 37 | 38 | 39 | ## Options 40 | 41 | This menu contains some general options: 42 | 43 | * Reset Processor at start: If this option is marked the registers and memory are reset every time you start a new simulation. Otherwise, the values are perserved. 44 | * Check VLIW Code: If this option is marked every new VLIW code is checked looking for errors. 45 | * % Data Cache Miss: Use this option to set the data cache miss rate when you use a LOAD instruction. Use 0 for no misses and 100 for direct main memory access. -------------------------------------------------------------------------------- /src/interface/actions/functional-unit-actions.ts: -------------------------------------------------------------------------------- 1 | import { FunctionalUntitVisualEntry } from "../../core/Common/FunctionalUnit"; 2 | 3 | export const FUNCTIONAL_UNIT_CYCLE = 'FUNCTIONAL_UNIT_CYCLE'; 4 | 5 | export function nextFunctionalUnitCycle(data) { 6 | return { 7 | type: FUNCTIONAL_UNIT_CYCLE, 8 | value: data.map(element => mapFunctionalUnitData(element)) 9 | }; 10 | } 11 | function mapFunctionalUnitData(data): any { 12 | let toReturnObject = { 13 | content: [], 14 | header: [] 15 | }; 16 | let content = new Array(); 17 | if (data != null && data[0] != null) { 18 | let aux = []; 19 | for (let j = 0; j < data.length; j++) { 20 | let instrsEntries: FunctionalUntitVisualEntry[] = data[j].getVisualData(); 21 | 22 | for (let entry of instrsEntries) { 23 | if (entry.id !== -1) { 24 | aux.push({ 25 | id: entry.id, 26 | value: entry.value, 27 | uid: entry.uid, 28 | color: '' 29 | }); 30 | } else { 31 | aux.push({ 32 | id: '-', 33 | value: '', 34 | uid: -1, 35 | color: '' 36 | }); 37 | } 38 | } 39 | } 40 | content.push(aux); 41 | 42 | } 43 | toReturnObject.content = content; 44 | toReturnObject.header = generateFunctionalUnitHeader(data); 45 | return toReturnObject; 46 | } 47 | 48 | function generateFunctionalUnitHeader(data): string[] { 49 | let toReturn = []; 50 | if (data != null) { 51 | for (let i = 0; i < data.length; i++) { 52 | toReturn.push(`#${i}`); 53 | } 54 | } 55 | return toReturn; 56 | } 57 | -------------------------------------------------------------------------------- /docs/en/barra-de-herramientas-estandar.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | lang: en 4 | id: barra-de-herramientas-estandar 5 | title: Standard Tool Bar 6 | prev: en/menu-ayuda.html 7 | next: en/barra-de-herramientas-de-ejecucion.html 8 | --- 9 | 10 | This tool bar contains general options. 11 | 12 | ![](imgs/bm2_result.png) Click this button to open a sequential code file. 13 | 14 | ![](imgs/bm3_result.png) Permite abrir un fichero con código secuencial. 15 | 16 | ![](imgs/bm4_result.png) Habilita la opción de colorear los bloques básicos en el código. 17 | 18 | ![](imgs/bm5_result.png) Muestra/oculta el código secuencial cargado de fichero. 19 | 20 | ![](imgs/bm6_result.png) Abre la ventana de Configuración de la Máquina Superescalar, con la que se pueden modificar sus parámetros más importantes. 21 | 22 | ![](imgs/bm7_result.png) Abre la ventana de Configuración de la Máquina VLIW, con la que se pueden modificar sus parámetros más importantes. 23 | 24 | ![](imgs/bm8_result.png) Permite establecer el porcentaje de fallos de caché de datos al realizar una instrucción de carga (LOAD). 0 significa que no habrá ningún fallo y 100 significa que todos los accesos producen fallo. 25 | 26 | {bml bm2.BMP} Click this button to open a sequential code file. 27 | 28 | {bml bm3.BMP} Click this button to colour the basic blocks in code window. 29 | 30 | {bml bm4.BMP} Click this button to show/hide the sequential code loaded from a file. 31 | 32 | {bml bm5.BMP} Click this button to open the Superscalar Configuration window. 33 | 34 | {bml bm6.BMP} Click this button to open the VLIW Configuration window. 35 | 36 | {bml bm7.BMP} Click this button to set the data cache miss rate when you use a LOAD instruction. Use 0 for no misses and 100 for direct main memory access. 37 | 38 | {bml bm8.BMP} Click this button to create a blank VLIW code. 39 | 40 | {bml bm9.BMP} Click this button to load a VLIW code from a file. -------------------------------------------------------------------------------- /docs/_book/gitbook/gitbook-plugin-lunr/search-lunr.js: -------------------------------------------------------------------------------- 1 | require([ 2 | 'gitbook', 3 | 'jquery' 4 | ], function(gitbook, $) { 5 | // Define global search engine 6 | function LunrSearchEngine() { 7 | this.index = null; 8 | this.store = {}; 9 | this.name = 'LunrSearchEngine'; 10 | } 11 | 12 | // Initialize lunr by fetching the search index 13 | LunrSearchEngine.prototype.init = function() { 14 | var that = this; 15 | var d = $.Deferred(); 16 | 17 | $.getJSON(gitbook.state.basePath+'/search_index.json') 18 | .then(function(data) { 19 | // eslint-disable-next-line no-undef 20 | that.index = lunr.Index.load(data.index); 21 | that.store = data.store; 22 | d.resolve(); 23 | }); 24 | 25 | return d.promise(); 26 | }; 27 | 28 | // Search for a term and return results 29 | LunrSearchEngine.prototype.search = function(q, offset, length) { 30 | var that = this; 31 | var results = []; 32 | 33 | if (this.index) { 34 | results = $.map(this.index.search(q), function(result) { 35 | var doc = that.store[result.ref]; 36 | 37 | return { 38 | title: doc.title, 39 | url: doc.url, 40 | body: doc.summary || doc.body 41 | }; 42 | }); 43 | } 44 | 45 | return $.Deferred().resolve({ 46 | query: q, 47 | results: results.slice(0, length), 48 | count: results.length 49 | }).promise(); 50 | }; 51 | 52 | // Set gitbook research 53 | gitbook.events.bind('start', function(e, config) { 54 | var engine = gitbook.search.getEngine(); 55 | if (!engine) { 56 | gitbook.search.setEngine(LunrSearchEngine, config); 57 | } 58 | }); 59 | }); 60 | -------------------------------------------------------------------------------- /.all-contributorsrc: -------------------------------------------------------------------------------- 1 | { 2 | "projectName": "SIMDE", 3 | "projectOwner": "SIMDE-ULL", 4 | "files": [ 5 | "README.md" 6 | ], 7 | "commitType": "docs", 8 | "commitConvention": "angular", 9 | "contributorsPerLine": 7, 10 | "contributors": [ 11 | { 12 | "login": "icasrod", 13 | "name": "Iván Castilla Rodríguez", 14 | "avatar_url": "https://avatars.githubusercontent.com/u/17193911?v=4", 15 | "profile": "https://github.com/icasrod", 16 | "contributions": [ 17 | "research", 18 | "projectManagement", 19 | "mentoring", 20 | "ideas", 21 | "example", 22 | "doc" 23 | ] 24 | }, 25 | { 26 | "login": "adrianabreu", 27 | "name": "Adrian Abreu Gonzalez", 28 | "avatar_url": "https://avatars.githubusercontent.com/u/9080392?v=4", 29 | "profile": "https://adrianabreu.gitlab.io", 30 | "contributions": [ 31 | "platform", 32 | "design" 33 | ] 34 | }, 35 | { 36 | "login": "alu0100884012", 37 | "name": "alu0100884012", 38 | "avatar_url": "https://avatars.githubusercontent.com/u/22546849?v=4", 39 | "profile": "https://github.com/alu0100884012", 40 | "contributions": [ 41 | "platform" 42 | ] 43 | }, 44 | { 45 | "login": "oxcabe", 46 | "name": "Óscar Carrasco", 47 | "avatar_url": "https://avatars.githubusercontent.com/u/25517190?v=4", 48 | "profile": "http://oxca.be", 49 | "contributions": [ 50 | "mentoring", 51 | "maintenance", 52 | "platform" 53 | ] 54 | }, 55 | { 56 | "login": "endes0", 57 | "name": "endes0", 58 | "avatar_url": "https://avatars.githubusercontent.com/u/5920682?v=4", 59 | "profile": "https://github.com/endes0", 60 | "contributions": [ 61 | "test", 62 | "maintenance" 63 | ] 64 | } 65 | ] 66 | } 67 | -------------------------------------------------------------------------------- /src/interface/utils/interval.ts: -------------------------------------------------------------------------------- 1 | export function generateIntervalFromImput(input: string, max: number): number[] { 2 | 3 | let newInterval = new Set(); 4 | 5 | if (!input) { 6 | throw new Error('noEmptyInput'); 7 | } 8 | 9 | input.split(',').map((value: string) => { 10 | 11 | if (value.includes('-')) { 12 | let range = value.split('-'); 13 | 14 | let num1 = parseInt(range[0]); 15 | let num2 = parseInt(range[1]); 16 | 17 | if (isNaN(num1) || isNaN(num2)) { 18 | throw new Error('noInputNumber'); 19 | } 20 | 21 | if (num1 >= max || num2 >= max) { 22 | throw new Error(`inputOutOfRange`); 23 | } 24 | 25 | if (num1 >= max) { 26 | num1 = max - 1; 27 | } 28 | if (num2 >= max) { 29 | num2 = max - 1; 30 | } 31 | if (num1 < num2) { 32 | for (; num1 <= num2; num1++) { 33 | newInterval.add(num1); 34 | } 35 | } else { 36 | for (; num2 <= num1; num2++) { 37 | newInterval.add(num2); 38 | } 39 | } 40 | } else { 41 | let num = parseInt(value); 42 | 43 | if (isNaN(num)) { 44 | throw new Error('noInputNumber'); 45 | } 46 | 47 | if (num >= max) { 48 | throw new Error(`inputOutOfRange`); 49 | } 50 | 51 | newInterval.add(num); 52 | } 53 | }); 54 | 55 | return Array.from(newInterval); 56 | } 57 | 58 | export function generateRangeArray(size) { 59 | if (size < 0) { 60 | throw new Error('Invalid array range'); 61 | } 62 | 63 | let range = []; 64 | for (let i = 0; i < size; i++) { 65 | range.push(i); 66 | } 67 | 68 | return range; 69 | } 70 | -------------------------------------------------------------------------------- /src/test/functional/Superscalar/rawdependency.spec.ts: -------------------------------------------------------------------------------- 1 | import { expect, beforeEach, test } from 'vitest' 2 | import { Code } from '../../../core/Common/Code'; 3 | import { Superscalar } from '../../../core/Superscalar/Superscalar'; 4 | import { SuperscalarStatus } from '../../../core/Superscalar/SuperscalarEnums'; 5 | 6 | const context: { code: Code, machine: Superscalar } = { code: null, machine: null }; 7 | 8 | beforeEach(() => { 9 | context.code = new Code(); 10 | context.machine = new Superscalar(); 11 | context.machine.init(true); 12 | }); 13 | 14 | test('GPR does not have RaW Hazards', t => { 15 | // Execute code 16 | context.code.load("3\n ADDI R1 R0 #1 \n MULT R2 R1 R1 \n ADDI R3 R2 #1"); 17 | context.machine.code = context.code; 18 | while (context.machine.tic() !== SuperscalarStatus.SUPER_ENDEXE) { } 19 | 20 | // Check where the program counter is 21 | expect(context.machine.pc).toBe(3); 22 | 23 | // Check the result 24 | expect(context.machine.getGpr(3)).toBe(2); 25 | }) 26 | 27 | test('FPR does not have RaW Hazards', t => { 28 | // Execute code 29 | context.machine.setFpr(1, 1); 30 | context.code.load("2\n MULTF F2 F1 F1 \n ADDF F3 F2 F1"); 31 | context.machine.code = context.code; 32 | while (context.machine.tic() !== SuperscalarStatus.SUPER_ENDEXE) { } 33 | 34 | // Check where the program counter is 35 | expect(context.machine.pc).toBe(2); 36 | 37 | // Check the result 38 | expect(context.machine.getFpr(3)).toBe(2); 39 | }) 40 | 41 | test('Memory does not have RaW Hazards', t => { 42 | // Execute code 43 | context.code.load("3\n ADDI R1 R0 #1 \n SW R1 0(R0) \n LW R3 0(R0)"); 44 | context.machine.code = context.code; 45 | while (context.machine.tic() !== SuperscalarStatus.SUPER_ENDEXE) { } 46 | 47 | // Check where the program counter is 48 | expect(context.machine.pc).toBe(3); 49 | 50 | // Check the result 51 | expect(context.machine.getGpr(3)).toBe(1); 52 | }) -------------------------------------------------------------------------------- /src/interface/components/LandingPage/ProjectPageComponent.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react"; 2 | import { Link } from 'react-router-dom'; 3 | import { useTranslation } from "react-i18next"; 4 | 5 | 6 | const ProjectPage = () => { 7 | const [t, _] = useTranslation(); 8 | 9 | return ( 10 |
11 |
12 |
    13 | icon 14 |
  • {t('landingPage.pagetitle')}

  • 15 |
  • {t('landingPage.home')}
  • 16 |
  • {t('landingPage.project')}
  • 17 |
18 |
19 |
20 |

{t('projectPage.pagetitle')}

21 |
simdegif
22 |

{t('projectPage.watsimde')}

23 |

{t('projectPage.simdedescription1')}

24 |

{t('projectPage.simdedescription2')}

25 |

{t('projectPage.simdedescription3')}

26 |

{t('projectPage.tecnology')}

27 |

{t('projectPage.tecnologydescription')}

28 |

{t('projectPage.howtouse')}

29 |

{t('projectPage.howtousedescription')}

30 |

{t('projectPage.problems')}

31 |

{t('projectPage.problemsdescription')}

32 |
33 | 36 |
37 | ); 38 | } 39 | 40 | export default ProjectPage; 41 | -------------------------------------------------------------------------------- /src/interface/actions/predicate-nat-actions.ts: -------------------------------------------------------------------------------- 1 | export const NEXT_NAT_FPR_CYCLE = 'NEXT_NAT_FPR_CYCLE'; 2 | export const NEXT_NAT_GPR_CYCLE = 'NEXT_NAT_GPR_CYCLE'; 3 | export const NEXT_PREDICATE_CYCLE = 'NEXT_PREDICATE_CYCLE'; 4 | 5 | export const ADD_NAT_FPR_INTERVAL = 'ADD_NAT_FPR_INTERVAL'; 6 | export const ADD_NAT_GPR_INTERVAL = 'ADD_NAT_GPR_INTERVAL'; 7 | export const REMOVE_NAT_FPR_INTERVAL = 'REMOVE_NAT_FPR_INTERVAL'; 8 | export const REMOVE_NAT_GPR_INTERVAL = 'REMOVE_NAT_GPR_INTERVAL'; 9 | export const ADD_PREDICATE_INTERVAL = 'ADD_PREDICATE_INTERVAL'; 10 | export const REMOVE_PREDICATE_INTERVAL = 'REMOVE_PREDICATE_INTERVAL'; 11 | 12 | export function addNatFprInterval(data) { 13 | return { 14 | type: ADD_NAT_FPR_INTERVAL, 15 | value: data 16 | }; 17 | } 18 | 19 | export function addNatGprInterval(data) { 20 | return { 21 | type: ADD_NAT_GPR_INTERVAL, 22 | value: data 23 | }; 24 | } 25 | 26 | export function removeNatFprInterval(data) { 27 | return { 28 | type: REMOVE_NAT_FPR_INTERVAL, 29 | value: new Set(data) 30 | }; 31 | } 32 | 33 | export function removeNatGprInterval(data) { 34 | return { 35 | type: REMOVE_NAT_GPR_INTERVAL, 36 | value: new Set(data) 37 | }; 38 | } 39 | 40 | export function addMemoryInterval(data) { 41 | return { 42 | type: ADD_PREDICATE_INTERVAL, 43 | value: data 44 | }; 45 | } 46 | 47 | export function removeMemoryInterval(data) { 48 | return { 49 | type: REMOVE_PREDICATE_INTERVAL, 50 | value: new Set(data) 51 | }; 52 | } 53 | 54 | export function nextNatFprCycle(data) { 55 | return { 56 | type: NEXT_NAT_FPR_CYCLE, 57 | value: data 58 | }; 59 | } 60 | 61 | export function nextNatGprCycle(data) { 62 | return { 63 | type: NEXT_NAT_GPR_CYCLE, 64 | value: data 65 | }; 66 | } 67 | 68 | export function nextPredicateCycle(data) { 69 | return { 70 | type: NEXT_PREDICATE_CYCLE, 71 | value: data 72 | }; 73 | } 74 | --------------------------------------------------------------------------------