hdl-js
Version:
Hardware definition language (HDL) and Hardware simulator
128 lines (111 loc) • 2.48 kB
JavaScript
/**
* The MIT License (MIT)
* Copyright (c) 2017-present Dmitry Soshnikov <dmitry.soshnikov@gmail.com>
*/
;
/**
* Converts a number to signed 16-bit integer.
*/
function int16(v) {
if (typeof v === 'string') {
v = Number.parseInt(v, 2);
}
return v << 16 >> 16;
}
/**
* Converts all rows in a table to `int16`.
*/
function int16Table(table) {
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = table[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var row = _step.value;
for (var pin in row) {
if (pin === '$clock') {
continue;
}
row[pin] = int16(row[pin]);
}
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
return table;
}
/**
* Converts a number to unsigned 16-bit integer.
*/
function uint16(v) {
return v & 0xffff;
}
/**
* Test for a neagtive zero.
*/
function isNegativeZero(value) {
return value === 0 && 1 / value === -Infinity;
}
/**
* Converts a number value to decimal string with the sign.
*/
function toSignedString(value) {
if (isNegativeZero(value)) {
return '-0';
}
return (value >= 0 ? '+' : '') + value;
}
/**
* Returns the value of particular bit in a 16-bit number.
*/
function getBitAt(number, index) {
return number >> index & 1;
}
/**
* Sets a particular bit to the value.
*/
function setBitAt(number, index, value) {
// Set 1.
if (value === 1) {
number |= 1 << index;
} else {
// Set 0 ("clear").
number &= ~(1 << index);
}
return number;
}
/**
* Returns a bit range.
*/
function getBitRange(number, from, to) {
return number >> from & (1 << to + 1 - from) - 1;
}
/**
* Sets a bits range.
*/
function setBitRange(number, from, to, range) {
var mask = (1 << to + 1 - from) - 1 << from;
return number & ~mask | range << from & mask;
}
module.exports = {
getBitAt: getBitAt,
getBitRange: getBitRange,
int16: int16,
int16Table: int16Table,
isNegativeZero: isNegativeZero,
setBitAt: setBitAt,
setBitRange: setBitRange,
toSignedString: toSignedString,
uint16: uint16
};