From 2759acd958c38f2c0f56e538d45774feccd46a56 Mon Sep 17 00:00:00 2001 From: Steven Hugg Date: Tue, 10 Jul 2018 23:04:28 -0500 Subject: [PATCH] converted some worker helper files to .ts (loadGen) --- .gitignore | 1 + src/worker/{assembler.js => assembler.ts} | 112 +++++++++++++----- .../{verilator2js.js => verilator2js.ts} | 40 ++++++- src/worker/workermain.js | 10 +- test/cli/testasm.js | 2 +- 5 files changed, 128 insertions(+), 37 deletions(-) rename src/worker/{assembler.js => assembler.ts} (78%) rename src/worker/{verilator2js.js => verilator2js.ts} (85%) diff --git a/.gitignore b/.gitignore index 378ef9af..cc0a0d40 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ scripts blog local release +gen diff --git a/src/worker/assembler.js b/src/worker/assembler.ts similarity index 78% rename from src/worker/assembler.js rename to src/worker/assembler.ts index 0bfe65f9..6cc67712 100644 --- a/src/worker/assembler.js +++ b/src/worker/assembler.ts @@ -1,19 +1,74 @@ -var Assembler = function(spec) { +type AssemblerVar = { + bits : number, + toks : string[], + iprel? : boolean, + ipofs? : number +} + +type AssemblerRule = { + fmt : string, + bits : (string | number)[], + // added at runtime + re? : RegExp, + prefix? : string, + varlist? : string[] +} + +type AssemblerVarList = {[name:string] : AssemblerVar}; + +type AssemblerLine = {line:number, offset:number, nbits:number, insns?:string}; + +type AssemblerFixup = { + sym:string, + ofs:number, + bitlen:number, + bitofs:number, + line:number, + iprel:boolean, + ipofs:number +}; + +type AssemblerSpec = { + name : string, + width : number, + vars : AssemblerVarList, + rules : AssemblerRule[] +} + +type AssemblerInstruction = {opcode:number, nbits : number}; + +type AssemblerLineResult = {error:string} | AssemblerInstruction; + +type AssemblerError = {msg:string, line:number}; + +type AssemblerState = { + ip: number, + line: number, + origin: number, + codelen: number, + intermediate: any, + output: number[], + lines: AssemblerLine[], + errors: AssemblerError[], + fixups: AssemblerFixup[] +} + +var Assembler = function(spec : AssemblerSpec) { var self = this; var ip = 0; var origin = 0; var linenum = 0; - var symbols = {}; - var errors = []; - var outwords = []; - var asmlines = []; - var fixups = []; + var symbols : {[name:string] : {value:number}} = {}; + var errors : AssemblerError[] = []; + var outwords : number[] = []; + var asmlines : AssemblerLine[] = []; + var fixups : AssemblerFixup[] = []; var width = 8; var codelen = 0; var aborted = false; - function rule2regex(rule, vars) { + function rule2regex(rule : AssemblerRule, vars : AssemblerVarList) { var s = rule.fmt; var varlist = []; rule.prefix = s.split(/\s+/)[0]; @@ -24,7 +79,7 @@ var Assembler = function(spec) { s = s.replace(/\]/g, '\\]'); s = s.replace(/\./g, '\\.'); // TODO: more escapes? - s = s.replace(/~\w+/g, function(varname) { + s = s.replace(/~\w+/g, function(varname:string) { varname = varname.substr(1); var v = vars[varname]; varlist.push(varname); @@ -49,17 +104,17 @@ var Assembler = function(spec) { } if (spec) preprocessRules(); - function warning(msg, line) { + function warning(msg:string, line?:number) { errors.push({msg:msg, line:line?line:linenum}); } - function fatal(msg, line) { + function fatal(msg:string, line?:number) { warning(msg, line); aborted = true; } - function fatalIf(msg, line) { + function fatalIf(msg?:string, line?:number) { if (msg) fatal(msg, line); } - function hex(v, nd) { + function hex(v:number, nd:number) { try { if (!nd) nd = 2; var s = v.toString(16).toUpperCase(); @@ -70,7 +125,7 @@ var Assembler = function(spec) { return v+""; } } - function addBytes(result) { + function addBytes(result:AssemblerInstruction) { asmlines.push({ line:linenum, offset:ip, @@ -82,7 +137,7 @@ var Assembler = function(spec) { outwords[ip++ - origin] = (op >> (nb-1-i)*width) & ((1< mask || value < -mask) @@ -292,7 +345,7 @@ var Assembler = function(spec) { return self.state(); } - self.assembleFile = function(text) { + self.assembleFile = function(text) : AssemblerState { var lines = text.split(/\n/g); for (var i=0; i