Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 47 additions & 10 deletions lib/render.js
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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;
}
Expand All @@ -188,24 +192,25 @@ 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)));
} else {
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', {
Expand Down Expand Up @@ -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);
Expand Down
78 changes: 78 additions & 0 deletions test/bigendian.js
Original file line number Diff line number Diff line change
@@ -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 */