From eb93a96190d5851087fff8e598fc56704f4d2028 Mon Sep 17 00:00:00 2001 From: Shivam Sahu Date: Sun, 9 Mar 2025 20:08:35 +0530 Subject: [PATCH] Added Subtractor Component to misc menu --- v0/src/assets/img/Adder.svg | 28 +++++- v0/src/assets/img/Subtractor.svg | 29 ++++++ v0/src/simulator/src/img/Adder.svg | 28 +++++- v0/src/simulator/src/img/Subtractor.svg | 29 ++++++ v0/src/simulator/src/metadata.json | 2 + v0/src/simulator/src/moduleSetup.js | 2 + v0/src/simulator/src/modules/Subtractor.js | 111 +++++++++++++++++++++ 7 files changed, 227 insertions(+), 2 deletions(-) create mode 100644 v0/src/assets/img/Subtractor.svg create mode 100644 v0/src/simulator/src/img/Subtractor.svg create mode 100644 v0/src/simulator/src/modules/Subtractor.js diff --git a/v0/src/assets/img/Adder.svg b/v0/src/assets/img/Adder.svg index 9249cff0..bd61c41a 100644 --- a/v0/src/assets/img/Adder.svg +++ b/v0/src/assets/img/Adder.svg @@ -1 +1,27 @@ - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v0/src/assets/img/Subtractor.svg b/v0/src/assets/img/Subtractor.svg new file mode 100644 index 00000000..5da7a6eb --- /dev/null +++ b/v0/src/assets/img/Subtractor.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v0/src/simulator/src/img/Adder.svg b/v0/src/simulator/src/img/Adder.svg index 9249cff0..bd61c41a 100644 --- a/v0/src/simulator/src/img/Adder.svg +++ b/v0/src/simulator/src/img/Adder.svg @@ -1 +1,27 @@ - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v0/src/simulator/src/img/Subtractor.svg b/v0/src/simulator/src/img/Subtractor.svg new file mode 100644 index 00000000..5da7a6eb --- /dev/null +++ b/v0/src/simulator/src/img/Subtractor.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v0/src/simulator/src/metadata.json b/v0/src/simulator/src/metadata.json index 8ed4f225..4c9ba119 100644 --- a/v0/src/simulator/src/metadata.json +++ b/v0/src/simulator/src/metadata.json @@ -21,6 +21,7 @@ "ControlledInverter", "TriState", "Adder", + "Subtractor", "verilogMultiplier", "verilogDivider", "verilogPower", @@ -161,6 +162,7 @@ { "name": "Flag", "label": "Flag" }, { "name": "Splitter", "label": "Splitter" }, { "name": "Adder", "label": "Adder" }, + { "name": "Subtractor", "label": "Subtractor" }, { "name": "ALU", "label": "ALU(Arithmetic and Logical Unit)" }, { "name": "TriState", "label": "TriState Flip Flop" }, { "name": "Tunnel", "label": "Tunnel" }, diff --git a/v0/src/simulator/src/moduleSetup.js b/v0/src/simulator/src/moduleSetup.js index 5002bc69..64843285 100644 --- a/v0/src/simulator/src/moduleSetup.js +++ b/v0/src/simulator/src/moduleSetup.js @@ -1,5 +1,6 @@ import modules from './modules' import Adder from './modules/Adder' +import Subtractor from './modules/Subtractor' import ALU from './modules/ALU' import AndGate from './modules/AndGate' import Arrow from './modules/Arrow' @@ -84,6 +85,7 @@ export default function setupModules() { Buffer, ControlledInverter, Adder, + Subtractor, verilogMultiplier, verilogDivider, verilogPower, diff --git a/v0/src/simulator/src/modules/Subtractor.js b/v0/src/simulator/src/modules/Subtractor.js new file mode 100644 index 00000000..ab99e944 --- /dev/null +++ b/v0/src/simulator/src/modules/Subtractor.js @@ -0,0 +1,111 @@ +/* eslint-disable no-bitwise */ +import CircuitElement from '../circuitElement'; +import Node, { findNode } from '../node'; +import simulationArea from '../simulationArea'; + +/** + * @class + * Subtractor + * @extends CircuitElement + * @param {number} x - x coordinate of element. + * @param {number} y - y coordinate of element. + * @param {Scope=} scope - Cirucit on which element is drawn + * @param {string=} dir - direction of element + * @param {number=} bitWidth - bit width per node. + * @category modules + */ +export default class Subtractor extends CircuitElement { + constructor(x, y, scope = globalScope, dir = 'RIGHT', bitWidth = 1) { + super(x, y, scope, dir, bitWidth); + /* this is done in this.baseSetup() now + this.scope['Subtractor'].push(this); + */ + this.setDimensions(20, 20); + + this.inpA = new Node(-20, -10, 0, this, this.bitWidth, 'A'); + this.inpB = new Node(-20, 0, 0, this, this.bitWidth, 'B'); + this.borrowIn = new Node(-20, 10, 0, this, 1, 'Bin'); + this.diff = new Node(20, 0, 1, this, this.bitWidth, 'Diff'); + this.borrowOut = new Node(20, 10, 1, this, 1, 'Bout'); + } + + /** + * @memberof Subtractor + * fn to create save Json Data of object + * @return {JSON} + */ + customSave() { + const data = { + constructorParamaters: [this.direction, this.bitWidth], + nodes: { + inpA: findNode(this.inpA), + inpB: findNode(this.inpB), + borrowIn: findNode(this.borrowIn), + borrowOut: findNode(this.borrowOut), + diff: findNode(this.diff), + }, + }; + return data; + } + + /** + * @memberof Subtractor + * Checks if the element is resolvable + * @return {boolean} + */ + isResolvable() { + return this.inpA.value !== undefined && this.inpB.value !== undefined; + } + + /** + * @memberof Subtractor + * function to change bitwidth of the element + * @param {number} bitWidth - new bitwidth + */ + newBitWidth(bitWidth) { + this.bitWidth = bitWidth; + this.inpA.bitWidth = bitWidth; + this.inpB.bitWidth = bitWidth; + this.diff.bitWidth = bitWidth; + } + + /** + * @memberof Subtractor + * resolve output values based on inputData + */ + resolve() { + if (this.isResolvable() === false) { + return; + } + let borrowIn = this.borrowIn.value; + if (borrowIn === undefined) borrowIn = 0; + + // Calculate difference + let diff = this.inpA.value - this.inpB.value - borrowIn; + + // Handle borrow out + this.borrowOut.value = +(diff < 0); + + // Ensure the result fits within bitWidth + this.diff.value = ((diff) << (32 - this.bitWidth)) >>> (32 - this.bitWidth); + simulationArea.simulationQueue.add(this.borrowOut); + simulationArea.simulationQueue.add(this.diff); + } + + generateVerilog() { + if (this.borrowIn.verilogLabel) { + return `assign ${this.diff.verilogLabel} = ${this.inpA.verilogLabel} - ${this.inpB.verilogLabel} - ${this.borrowIn.verilogLabel};`; + } + return `assign ${this.diff.verilogLabel} = ${this.inpA.verilogLabel} - ${this.inpB.verilogLabel};`; + } +} + +/** + * @memberof Subtractor + * Help Tip + * @type {string} + * @category modules + */ +Subtractor.prototype.tooltipText = 'Subtractor ToolTip : Performs subtraction of numbers.'; +Subtractor.prototype.helplink = 'https://docs.circuitverse.org/#/chapter4/8misc?id=subtractor'; +Subtractor.prototype.objectType = 'Subtractor'; \ No newline at end of file