UNPKG

hdl-js

Version:

Hardware definition language (HDL) and Hardware simulator

128 lines (111 loc) 2.48 kB
/** * The MIT License (MIT) * Copyright (c) 2017-present Dmitry Soshnikov <dmitry.soshnikov@gmail.com> */ 'use strict'; /** * 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 };