Comparing version 0.1.3 to 0.1.4
@@ -68,2 +68,3 @@ declare module "assembler/Parser" { | ||
private registerFile; | ||
mspi: number; | ||
private getRegVal(registerNum); | ||
@@ -74,3 +75,3 @@ private setRegVal(registerNum, value); | ||
}; | ||
constructor(registerFile: RegisterFile); | ||
constructor(registerFile: RegisterFile, mspi: number); | ||
getInstruction(key: string): Instruction; | ||
@@ -95,3 +96,3 @@ } | ||
[id: string]: number; | ||
}); | ||
}, clock: number, ipc: number); | ||
run(asmCode: string): void; | ||
@@ -98,0 +99,0 @@ notifyObserver(line: number): void; |
@@ -1,2 +0,2 @@ | ||
!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define("mips-core",[],e):"object"==typeof exports?exports["mips-core"]=e():t["mips-core"]=e()}(this,function(){return function(t){var e={};function r(n){if(e[n])return e[n].exports;var i=e[n]={i:n,l:!1,exports:{}};return t[n].call(i.exports,i,i.exports,r),i.l=!0,i.exports}return r.m=t,r.c=e,r.d=function(t,e,n){r.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:n})},r.r=function(t){Object.defineProperty(t,"__esModule",{value:!0})},r.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(e,"a",e),e},r.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},r.p="",r(r.s=10)}([function(t,e,r){var n;void 0===(n=function(t,e){"use strict";var r;Object.defineProperty(e,"__esModule",{value:!0}),function(t){t[t.READ=0]="READ",t[t.WRITE=1]="WRITE",t[t.RESET=2]="RESET"}(r=e.RegisterAccessType||(e.RegisterAccessType={}));var n=function(){function t(t,e,r){this.observer=null,this.name=t,this.num=e,this.value=r,this.resetVal=r}return t.prototype.notifyObserver=function(t){this.observer&&this.observer(this.num,t)},t.prototype.reset=function(){this.value=this.resetVal,this.notifyObserver(r.RESET)},t.prototype.set=function(t){this.value=t,this.notifyObserver(r.WRITE)},t.prototype.get=function(){return this.notifyObserver(r.READ),this.value},t}();e.Register=n}.apply(e,[r,e]))||(t.exports=n)},function(t,e,r){var n,i;n=[r,e,r(0),r(7)],void 0===(i=function(t,e,r,n){"use strict";function i(t){for(var r in t)e.hasOwnProperty(r)||(e[r]=t[r])}Object.defineProperty(e,"__esModule",{value:!0}),i(r),i(n)}.apply(e,n))||(t.exports=i)},function(t,e,r){var n;void 0===(n=function(t,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),function(t){t[t.R_FORMAT=0]="R_FORMAT",t[t.I_FORMAT=1]="I_FORMAT"}(e.InstructionFormat||(e.InstructionFormat={}))}.apply(e,[r,e]))||(t.exports=n)},function(t,e,r){var n,i;n=[r,e,r(2),r(8)],void 0===(i=function(t,e,r,n){"use strict";function i(t){for(var r in t)e.hasOwnProperty(r)||(e[r]=t[r])}Object.defineProperty(e,"__esModule",{value:!0}),i(r),i(n)}.apply(e,n))||(t.exports=i)},function(t,e,r){var n,i;n=[r,e,r(9)],void 0===(i=function(t,e,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),function(t){for(var r in t)e.hasOwnProperty(r)||(e[r]=t[r])}(r)}.apply(e,n))||(t.exports=i)},function(t,e,r){var n,i;n=[r,e,r(4),r(1),r(3)],void 0===(i=function(t,e,r,n,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=function(){function t(t){this.observer=null,this.registerFile=new n.RegisterFile(t),this.instructionSet=new i.InstructionSet(this.registerFile);var e=Object.keys(this.instructionSet.instructions);this.parser=new r.Parser(t,e)}return t.prototype.run=function(t){var e=this.parser.parse(t);for(var r in e){var n=parseInt(r,10);if(e[n]){this.notifyObserver(n);var i=e[n];this.instructionSet.getInstruction(i[0]).run(i[1],i[2],i[3])}}},t.prototype.notifyObserver=function(t){this.observer&&this.observer(t)},t}();e.Simulator=o}.apply(e,n))||(t.exports=i)},function(t,e,r){var n,i;n=[r,e,r(5)],void 0===(i=function(t,e,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),function(t){for(var r in t)e.hasOwnProperty(r)||(e[r]=t[r])}(r)}.apply(e,n))||(t.exports=i)},function(t,e,r){var n,i;n=[r,e,r(0)],void 0===(i=function(t,e,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var n=function(){function t(t){for(var e in this.registerList=[],t){var n=t[e];this.registerList[n]=new r.Register(e,n,0)}}return t.prototype.getRegister=function(t){return this.registerList[t]},t.prototype.setObserver=function(t){for(var e=0,r=this.registerList;e<r.length;e++){r[e].observer=t}},t}();e.RegisterFile=n}.apply(e,n))||(t.exports=i)},function(t,e,r){var n,i;n=[r,e,r(2)],void 0===(i=function(t,e,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var n=function(){function t(t){var e=this;this.instructions={add:{format:r.InstructionFormat.R_FORMAT,run:function(t,r,n){var i=e.getRegVal(r),o=e.getRegVal(n);e.setRegVal(t,i+o)}},addi:{format:r.InstructionFormat.I_FORMAT,run:function(t,r,n){var i=e.getRegVal(r);e.setRegVal(t,i+n)}},sub:{format:r.InstructionFormat.R_FORMAT,run:function(t,r,n){var i=e.getRegVal(r),o=e.getRegVal(n);e.setRegVal(t,i-o)}}},this.registerFile=t}return t.prototype.getRegVal=function(t){return this.registerFile.getRegister(t).get()},t.prototype.setRegVal=function(t,e){return this.registerFile.getRegister(t).set(e)},t.prototype.getInstruction=function(t){return this.instructions[t]},t}();e.InstructionSet=n}.apply(e,n))||(t.exports=i)},function(t,e,r){var n;void 0===(n=function(t,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=function(){function t(t,e){this.registerMap=t,this.keyword=e}return t.prototype.getRegisterNum=function(t){var e=this.registerMap[t];if(void 0===e)throw new Error("No such register "+t);return e},t.prototype.parse=function(t){for(var e=[],r=0,n=t.split(/\n/);r<n.length;r++){var i=n[r];e.push(this.parseLine(i))}return e},t.prototype.parseLine=function(t){for(var e=[],r=0,n=t.split(" ");r<n.length;r++){var i=n[r];if(i=i.split(",")[0]){if(i.startsWith("#"))break;if(i.startsWith("$"))e.push(this.getRegisterNum(i));else{if(i.endsWith(":"))throw new Error("label not support now");if(i.includes("("))throw new Error("sw/lw not support now");this.keyword.includes(i)?e.push(i):e.push(parseInt(i,10))}}}return e},t}();e.Parser=r}.apply(e,[r,e]))||(t.exports=n)},function(t,e,r){var n,i;n=[r,e,r(4),r(3),r(1),r(6)],void 0===(i=function(t,e,r,n,i,o){"use strict";function s(t){for(var r in t)e.hasOwnProperty(r)||(e[r]=t[r])}Object.defineProperty(e,"__esModule",{value:!0}),s(r),s(n),s(i),s(o)}.apply(e,n))||(t.exports=i)}])}); | ||
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define("mips-core",[],t):"object"==typeof exports?exports["mips-core"]=t():e["mips-core"]=t()}(this,function(){return function(e){var t={};function n(o){if(t[o])return t[o].exports;var r=t[o]={i:o,l:!1,exports:{}};return e[o].call(r.exports,r,r.exports,n),r.l=!0,r.exports}return n.m=e,n.c=t,n.d=function(e,t,o){n.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:o})},n.r=function(e){Object.defineProperty(e,"__esModule",{value:!0})},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=0)}([function(e,t){(void 0)(["./assembler","./instruction","./hardware","./simulator"],function(e,t){"use strict";t&&t.id;function n(t){var n={};for(var o in t)"default"!==o&&(n[o]=t[o]);e(n)}return{setters:[function(e){n(e)},function(e){n(e)},function(e){n(e)},function(e){n(e)}],execute:function(){}}})}])}); | ||
//# sourceMappingURL=mips-core.js.map |
{ | ||
"name": "mips-core", | ||
"version": "0.1.3", | ||
"version": "0.1.4", | ||
"description": "MIPS Assembler Simulator Inspired by MARS", | ||
@@ -10,3 +10,3 @@ "main": "build/mips-core.js", | ||
"build": "webpack", | ||
"test": "nyc mocha", | ||
"test": "TS_NODE_COMPILER_OPTIONS='{\"module\":\"commonjs\"}' nyc mocha", | ||
"coverage": "nyc report --reporter=text-lcov | coveralls" | ||
@@ -43,3 +43,3 @@ }, | ||
"src/**/index.ts", | ||
"src/lib.ts" | ||
"src/mips-core.ts" | ||
], | ||
@@ -46,0 +46,0 @@ "extension": [ |
# MIPS-CORE | ||
![travis](https://travis-ci.org/sn0wle0pard/mips-core.svg?branch=master) [![Coverage Status](https://coveralls.io/repos/github/sn0wle0pard/mips-core/badge.svg?branch=master)](https://coveralls.io/github/sn0wle0pard/mips-core?branch=master) | ||
[![Build Status](https://travis-ci.org/sn0wle0pard/mips-core.svg?branch=master)](https://travis-ci.org/sn0wle0pard/mips-core) [![Coverage Status](https://coveralls.io/repos/github/sn0wle0pard/mips-core/badge.svg?branch=master)](https://coveralls.io/github/sn0wle0pard/mips-core?branch=master) | ||
> MIPS Assembler Simulator Inspired by [MARS](http://courses.missouristate.edu/KenVollmar/mars/) | ||
@@ -4,0 +4,0 @@ |
@@ -10,4 +10,9 @@ import { | ||
function sleep(ms: number) { | ||
return new Promise(resolve=> setTimeout(resolve, ms)); | ||
} | ||
export class InstructionSet { | ||
private registerFile: RegisterFile; | ||
mspi: number; | ||
@@ -25,6 +30,10 @@ private getRegVal(registerNum: number): number { | ||
format: InstructionFormat.R_FORMAT, | ||
run: (rs: number, rt: number, rd: number) => { | ||
run: async (rs: number, rt: number, rd: number) => { | ||
const sleepTime: number = this.mspi / 3; | ||
const rtValue: number = this.getRegVal(rt); | ||
await sleep(sleepTime); | ||
const rdValue: number = this.getRegVal(rd); | ||
await sleep(sleepTime); | ||
this.setRegVal(rs, rtValue + rdValue); | ||
await sleep(sleepTime); | ||
}, | ||
@@ -34,5 +43,8 @@ }, | ||
format: InstructionFormat.I_FORMAT, | ||
run: (rs: number, rt: number, imm: number) => { | ||
run: async (rs: number, rt: number, imm: number) => { | ||
const sleepTime: number = this.mspi / 2; | ||
const rtValue: number = this.getRegVal(rt); | ||
await sleep(sleepTime); | ||
this.setRegVal(rs, rtValue + imm); | ||
await sleep(sleepTime); | ||
}, | ||
@@ -42,6 +54,10 @@ }, | ||
format: InstructionFormat.R_FORMAT, | ||
run: (rs: number, rt: number, rd: number) => { | ||
run: async (rs: number, rt: number, rd: number) => { | ||
const sleepTime: number = this.mspi / 3; | ||
const rtValue: number = this.getRegVal(rt); | ||
await sleep(sleepTime); | ||
const rdValue: number = this.getRegVal(rd); | ||
await sleep(sleepTime); | ||
this.setRegVal(rs, rtValue - rdValue); | ||
await sleep(sleepTime); | ||
}, | ||
@@ -51,4 +67,5 @@ }, | ||
constructor(registerFile: RegisterFile) { | ||
constructor(registerFile: RegisterFile, mspi: number) { | ||
this.registerFile = registerFile; | ||
this.mspi = mspi; | ||
} | ||
@@ -55,0 +72,0 @@ |
@@ -43,6 +43,6 @@ import * as assert from 'assert'; | ||
const registerFile: RegisterFile = new RegisterFile(registerMap); | ||
const instructionSet: InstructionSet = new InstructionSet(registerFile); | ||
const instructionSet: InstructionSet = new InstructionSet(registerFile, 100); | ||
describe('InstructionSet', () => { | ||
it('add', () => { | ||
it('add', async () => { | ||
const rs: number = 16; | ||
@@ -58,3 +58,3 @@ const rt: number = 17; | ||
instructionSet.getInstruction('add').run(rs, rt, rd); | ||
await instructionSet.getInstruction('add').run(rs, rt, rd); | ||
@@ -66,3 +66,3 @@ assert.strictEqual(registerFile.getRegister(rs).value, rtVal + rdVal); | ||
it('addi', () => { | ||
it('addi', async () => { | ||
const rs: number = 16; | ||
@@ -74,3 +74,3 @@ const rt: number = 17; | ||
instructionSet.getInstruction('addi').run(rs, rt, imm); | ||
await instructionSet.getInstruction('addi').run(rs, rt, imm); | ||
@@ -80,3 +80,3 @@ assert.strictEqual(registerFile.getRegister(rs).value, rtVal + imm); | ||
it('sub', () => { | ||
it('sub', async () => { | ||
const rs: number = 16; | ||
@@ -92,3 +92,3 @@ const rt: number = 17; | ||
instructionSet.getInstruction('sub').run(rs, rt, rd); | ||
await instructionSet.getInstruction('sub').run(rs, rt, rd); | ||
@@ -95,0 +95,0 @@ assert.strictEqual(registerFile.getRegister(rs).value, rtVal - rdVal); |
@@ -21,5 +21,6 @@ import { | ||
constructor(registerMap: {[id: string]: number}) { | ||
constructor(registerMap: {[id: string]: number}, clock: number, ipc: number) { | ||
this.registerFile = new RegisterFile(registerMap); | ||
this.instructionSet = new InstructionSet(this.registerFile); | ||
const mspi: number = 1000 / (clock * ipc); | ||
this.instructionSet = new InstructionSet(this.registerFile, mspi); | ||
const keyword: string[] = Object.keys(this.instructionSet.instructions); | ||
@@ -26,0 +27,0 @@ this.parser = new Parser(registerMap, keyword); |
@@ -40,2 +40,2 @@ import * as assert from 'assert'; | ||
const simulator: Simulator = new Simulator(registerMap); | ||
const simulator: Simulator = new Simulator(registerMap, 100, 1); |
@@ -10,3 +10,3 @@ { | ||
"outDir": "build", | ||
"module": "amd", | ||
"module": "system", | ||
"outFile": "build/mips-core.js", | ||
@@ -13,0 +13,0 @@ "noImplicitAny": true, |
Sorry, the diff of this file is not supported yet
28411