From ca5276f4ca3a095591876758fe3dc673ede34d14 Mon Sep 17 00:00:00 2001 From: Shimoda Date: Mon, 24 Feb 2020 13:06:36 +0900 Subject: [PATCH] added bigendian behavior --- lib/render.js | 57 ++++++++++++++++++++++++++++------ test/bigendian.js | 78 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 125 insertions(+), 10 deletions(-) create mode 100644 test/bigendian.js diff --git a/lib/render.js b/lib/render.js index a386814..190e823 100644 --- a/lib/render.js +++ b/lib/render.js @@ -86,7 +86,7 @@ function getLabel (val, x, y, step, len) { } function getAttr (e, opt, step, lsbm, msbm) { - var x = step * (opt.mod - ((msbm + lsbm) / 2) - 1); + var x = opt.xattr(lsbm, msbm, step); if (Array.isArray(e.attr)) { return e.attr.reduce(function (prev, a, i) { if (a === undefined || a === null) { @@ -126,15 +126,17 @@ function labelArr (desc, opt) { } } if (!opt.compact) { - bits.push(text(lsb, step * (opt.mod - lsbm - 1))); - if (lsbm !== msbm) { - bits.push(text(msb, step * (opt.mod - msbm - 1))); + var lsbn = opt.bitscaler(lsb); + var msbn = opt.bitscaler(msb); + bits.push(text(lsbn, step * opt.nlabel(lsbm))); + if (lsbm !== msbm && lsbn !== msbn) { + bits.push(text(msbn, step * opt.nlabel(msbm))); } } if (e.name) { names.push(getLabel( e.name, - step * (opt.mod - ((msbm + lsbm) / 2) - 1), + opt.xname(lsbm, msbm, step), 0, step, e.bits @@ -144,7 +146,7 @@ function labelArr (desc, opt) { if ((e.name === undefined) || (e.type !== undefined)) { blanks.push(['rect', { style: 'fill-opacity:0.1' + typeStyle(e.type), - x: step * (opt.mod - msbm - 1), + x: step * opt.nlabel(lsbm, msbm), y: 0, width: step * (msbm - lsbm + 1), height: opt.vspace / 2 @@ -167,7 +169,9 @@ function compactLabels(desc, opt) { 'font-weight': opt.fontweight || 'normal' }]; for (var i = 0; i < opt.mod; i++) { - labels.push(text(opt.mod - 1 - i, tx+ step*i, opt.fontsize)); + if ((i % opt.bitscale) != 0) { continue; } + var lbl = opt.bitscaler(opt.nlabel(i)); + labels.push(text(lbl, tx+ step*i, opt.fontsize)); } return labels; } @@ -188,6 +192,8 @@ function cage (desc, opt) { res.push(hline(hspace, 0, vspace / 2)); var i = opt.index * opt.mod, j = opt.mod; + var istep = opt.bigendian ? -1: 1; + if (opt.bigendian) { i += opt.mod; } do { if ((j === opt.mod) || desc.some(function (e) { return (e.lsb === i); })) { res.push(vline((vspace / 2), j * (hspace / mod))); @@ -195,17 +201,16 @@ function cage (desc, opt) { res.push(vline((vspace / 16), j * (hspace / mod))); res.push(vline((vspace / 16), j * (hspace / mod), vspace * 7 / 16)); } - i++; j--; + i += istep; j--; } while (j); return res; } function lane (desc, opt) { - var ty = (opt.lanes - opt.index - 1) * opt.vspace + 0.5; + var ty = opt.ylanetext(opt.index); var tx = 4.5; if (opt.compact) { - ty = (opt.lanes - opt.index - 1) * opt.vspace / 2 + opt.fontsize/2; tx += 20; } var lane = ['g', { @@ -235,6 +240,38 @@ function render (desc, opt) { opt.compact = opt.compact || false; opt.bigendian = opt.bigendian || false; + opt.bitscale = isIntGTorDefault(opt.bitscale, 0, 1); + + opt.bitscaler = function(bit) { + return Math.floor(bit / opt.bitscale); + }; + opt.nlabel = function(lsb, msb) { + var n = msb ? msb: lsb; + return opt.bigendian ? lsb: opt.mod - n - 1; + }; + opt.xname = function(lsb, msb, step) { + return opt.bigendian ? + step * (msb + lsb) / 2: + step * (opt.mod - ((msb + lsb) / 2) - 1); + }; + opt.xattr = function(lsb, msb, step) { + return opt.bigendian ? + step * (msb + lsb) / 2: + step * (opt.mod - ((msb + lsb) / 2) - 1); + }; + opt.ylanetext = function(index) { + var ty = 0; + if (opt.bigendian && opt.compact) { + ty = index * opt.vspace / 2 + opt.fontsize / 2; + } else if (opt.bigendian) { + ty = index * opt.vspace + 0.5; + } else if (opt.compact) { + ty = (opt.lanes - index - 1) * opt.vspace / 2 + opt.fontsize / 2; + } else { + ty = (opt.lanes - index - 1) * opt.vspace + 0.5; + } + return ty; + }; var attributes = desc.reduce(function (prev, cur) { return Math.max(prev, (Array.isArray(cur.attr)) ? cur.attr.length : 0); diff --git a/test/bigendian.js b/test/bigendian.js new file mode 100644 index 0000000..373a2a0 --- /dev/null +++ b/test/bigendian.js @@ -0,0 +1,78 @@ +'use strict'; + +var lib = require('../lib'), + onml = require('onml'), + jsof = require('jsof'); + + +var dat = { + bigendian1: { + src: [ + {bits: 1, name: '01h', attr: 'send'}, + {bits: 1, name: '82h', attr: 'resp'}, + {bits: 3} + ], + dst: [], + opt: {hspace: 800, bits: 5, bigendian: true} + }, + bigendian2: { + src: [ + {bits: 2, name: '5Ah', attr: 'delim'}, + {bits: 2, name: '01h', attr: 'cmd(send)'}, + {bits: 2, name: '01h', attr: 'len'}, + {bits: 2, name: 'D1h', attr: 'reg'}, + {bits: 4}, + {bits: 2, name: '??h', attr: 'chksum'}, + {bits: 2, name: 'C3h', attr: 'e-delim'} + ], + dst: [], + opt: {hspace: 800, bits: 16, lanes: 2, + bigendian: true, bitscale: 2} + }, + bigendian3: { + src: [ + {bits: 2, name: '5Ah'}, + + {bits: 2, name: '82h'}, + {bits: 2, name: '05h'}, + {bits: 2, name: '30h'}, + + {bits: 2, name: '2Eh'}, + {bits: 2, name: '34h'}, + {bits: 2, name: '2Eh'}, + {bits: 2, name: '31h'}, + + {bits: 8}, + + {bits: 4}, + {bits: 2, name: '??h'}, + {bits: 2, name: 'C3h'} + ], + dst: [], + opt: {hspace: 800, bits: 32, lanes: 4, compact: true, + bigendian: true, bitscale: 2} + } +}; + +describe('bigendian', function () { + Object.keys(dat).forEach(function (key) { + it(key, function (done) { + var src = dat[key].src; + var dst = dat[key].dst; + var opt = dat[key].opt; + var res = lib.render(src, opt); + try { + // expect(res).to.deep.eq(dst); + console.log(onml.stringify(res)); + } catch (err) { + console.log(jsof.s(res)); + throw err; + } + dst.unshift('text', {x: 20, y: 20, 'font-size': 16 }); + // var svg = ['svg', { viewBox: '0 0 400 100', width: 400, height: 100, xmlns: 'http://www.w3.org/2000/svg' }, dst]; + done(); + }); + }); +}); +/* eslint no-console: 0 */ +/* eslint-env mocha */