diff --git a/src/web/components/simulator/Register.vue b/src/web/components/simulator/Register.vue index 0186e96d..ebb69368 100644 --- a/src/web/components/simulator/Register.vue +++ b/src/web/components/simulator/Register.vue @@ -97,12 +97,13 @@ export default defineComponent({ // Access render to create a reactive dependency // eslint-disable-next-line @typescript-eslint/no-unused-expressions this.render; - if (this.type === "v_registers"){ + if (this.type === "v_registers") { // Only show the first elem of the vector let elem_size = document.app.$data.v_length / 4; // hex format - return this.show_value(this.value_representation).toString().slice(-elem_size); - } else - return this.show_value(this.value_representation).toString(); + return this.show_value(this.value_representation) + .toString() + .slice(-elem_size); + } else return this.show_value(this.value_representation).toString(); }, }, @@ -124,7 +125,7 @@ export default defineComponent({ }, showDetails() { - this.$emit("register-details", { + const details = { name: this.register.name, type: this.type, hex: this.show_value("hex"), @@ -136,7 +137,13 @@ export default defineComponent({ ieee64: this.show_value("ieee64"), indexComp: this.indexComp, indexElem: this.indexElem, - }); + }; + + // Emitimos un evento global + window.dispatchEvent( + new CustomEvent("open-register-space-view", { detail: details }), + ); + creator_ga("data", "data.view", "data.view.registers_details"); }, diff --git a/src/web/components/simulator/RegisterSpaceView.vue b/src/web/components/simulator/RegisterSpaceView.vue index db4945c2..49ef0dd1 100644 --- a/src/web/components/simulator/RegisterSpaceView.vue +++ b/src/web/components/simulator/RegisterSpaceView.vue @@ -23,44 +23,68 @@ import { writeRegister } from "@/core/register/registerOperations.mjs"; import { crex_findReg } from "@/core/register/registerLookup.mjs"; import { creator_ga } from "@/core/utils/creator_ga.mjs"; import { show_notification } from "@/web/utils.mjs"; -import { float2bin, double2bin, hex2float, hex2double } from "@/core/utils/utils.mjs"; +import { + float2bin, + double2bin, + hex2float, + hex2double, +} from "@/core/utils/utils.mjs"; import { defineComponent, type PropType } from "vue"; import { architecture } from "@/core/core.mjs"; export default defineComponent({ props: { id: { type: String, required: true }, - item: { - type: [Object, null] as PropType, - required: true, - }, }, // emits: ["update:show"], data() { return { + show: false, + item: null as RegisterDetailsItem | null, newValue: "", precision: "single", - Sail_arch: (architecture.config.name.includes("SRV")) ? true : false, - is_vtype: this.$props.item?.type === "v_registers", + Sail_arch: architecture.config.name.includes("SRV") ? true : false, }; }, computed: { + is_vtype(): boolean { + return this.item?.type === "v_registers"; + }, doublePrecision(): boolean { // TODO return false; }, modalSize() { - return (this.item?.type === "v_registers") ? 'modal-xl' : '' + return this.item?.type === "v_registers" ? "modal-xl" : ""; }, - vectorMaxLength(){ - return (512 / document.app.$data.v_length) - 1; - } + vectorMaxLength() { + return 512 / document.app.$data.v_length - 1; + }, + }, + + mounted() { + window.addEventListener( + "open-register-space-view", + this.handleOpenModal as EventListener, + ); + }, + + beforeUnmount() { + window.removeEventListener( + "open-register-space-view", + this.handleOpenModal as EventListener, + ); }, methods: { + handleOpenModal(event: CustomEvent) { + this.item = event.detail; + this.show = true; + }, + updateRegister(name: string, type: string, doublePrecision: boolean) { const reg = crex_findReg(name); const regSize = @@ -106,7 +130,7 @@ export default defineComponent({ // write and reset writeRegister(value!, reg.indexComp!, reg.indexElem!); this.newValue = ""; - // this.showValue = false // close popup + this.show = false; // close popup // Google Analytics creator_ga("data", "data.change", "data.change.register_value"); @@ -115,84 +139,94 @@ export default defineComponent({ // function to split in vector register file showValues(reg_type, data) { - let size_elem = document.app.$data.v_length; var elems = []; switch (reg_type) { case "Hex": - for (let i = 0; i < data.length; i+= (size_elem / 4)) { + for (let i = 0; i < data.length; i += size_elem / 4) { if (data.startsWith("0x")) { - elems.push("0x" + data.slice((i + 2), (i + 2) + (size_elem / 4))); - } else - elems.push("0x" + data.slice(i, i + (size_elem / 4))); + elems.push("0x" + data.slice(i + 2, i + 2 + size_elem / 4)); + } else elems.push("0x" + data.slice(i, i + size_elem / 4)); } break; - case "Signed": - for (let i = 0; i < data.length; i+= (size_elem / 4)) { - const singBit = 1n << BigInt(size_elem - 1); - const mask = 1n << BigInt(size_elem); - if (data.startsWith("0x")) { - const value = BigInt("0x" + data.slice((i + 2), (i + 2) + (size_elem / 4))); - elems.push((value & singBit) ? value - mask : value); - } else { - const value = BigInt("0x" + data.slice(i, i + (size_elem / 4))); - elems.push((value & singBit) ? value - mask : value); - } - + case "Signed": + for (let i = 0; i < data.length; i += size_elem / 4) { + const singBit = 1n << BigInt(size_elem - 1); + const mask = 1n << BigInt(size_elem); + if (data.startsWith("0x")) { + const value = BigInt( + "0x" + data.slice(i + 2, i + 2 + size_elem / 4), + ); + elems.push(value & singBit ? value - mask : value); + } else { + const value = BigInt("0x" + data.slice(i, i + size_elem / 4)); + elems.push(value & singBit ? value - mask : value); + } } break; case "Unsigned": - for (let i = 0; i < data.length; i+= (size_elem / 4)) { + for (let i = 0; i < data.length; i += size_elem / 4) { // if (size_elem <= 32) { if (data.startsWith("0x")) { - elems.push(BigInt("0x" + data.slice((i + 2), (i + 2) + (size_elem / 4)))); - } else - elems.push(BigInt("0x" + data.slice(i, i + (size_elem / 4)))); + elems.push( + BigInt("0x" + data.slice(i + 2, i + 2 + size_elem / 4)), + ); + } else elems.push(BigInt("0x" + data.slice(i, i + size_elem / 4))); } break; case "Binary": - for (let i = 0; i < data.length; i+= (size_elem / 4)) { + for (let i = 0; i < data.length; i += size_elem / 4) { if (data.startsWith("0x")) { - elems.push(data.slice((i + 2), (i + 2) + (size_elem / 4)).split('').map(h => parseInt(h, 16).toString(2).padStart(4, '0')).join('')); + elems.push( + data + .slice(i + 2, i + 2 + size_elem / 4) + .split("") + .map(h => parseInt(h, 16).toString(2).padStart(4, "0")) + .join(""), + ); } else { - elems.push(data.slice(i, i + (size_elem / 4)).split('').map(h => parseInt(h, 16).toString(2).padStart(4, '0')).join('')); + elems.push( + data + .slice(i, i + size_elem / 4) + .split("") + .map(h => parseInt(h, 16).toString(2).padStart(4, "0")) + .join(""), + ); } } break; case "Char": - if (data.startsWith("0x")) - data = data.slice(2, data.length); - for (let i = 0; i < data.length; i+= (size_elem / 4)) { - var elem = data.slice((i + 2), (i + 2) + (size_elem / 4)); + if (data.startsWith("0x")) data = data.slice(2, data.length); + for (let i = 0; i < data.length; i += size_elem / 4) { + var elem = data.slice(i + 2, i + 2 + size_elem / 4); elems.push(String.fromCharCode(parseInt(elem.slice(-2), 16))); } - + break; case "IEEE 754 32": - if (data.startsWith("0x")) - data = data.slice(2); - for (let i = 0; i < data.length; i+= (size_elem / 4)) { - var elem = data.slice(i, i + (size_elem / 4)); + if (data.startsWith("0x")) data = data.slice(2); + for (let i = 0; i < data.length; i += size_elem / 4) { + var elem = data.slice(i, i + size_elem / 4); elems.push(hex2float(elem)); } break; case "IEEE 754 64": - if (data.startsWith("0x")) - data = data.slice(2, data.length); - for (let i = 0; i < data.length; i+= (size_elem / 4)) { - var elem = data.slice(i, i + (size_elem / 4)); + if (data.startsWith("0x")) data = data.slice(2, data.length); + for (let i = 0; i < data.length; i += size_elem / 4) { + var elem = data.slice(i, i + size_elem / 4); elems.push(hex2double(elem)); } break; } return elems; - } + }, }, });