diff --git a/simulator/spec/misc.spec.js b/simulator/spec/misc.spec.js index bf4d835608..b5f3400047 100644 --- a/simulator/spec/misc.spec.js +++ b/simulator/spec/misc.spec.js @@ -51,7 +51,7 @@ describe('Simulator Misc-Elements Testing', () => { test('Controlled Inverter working', () => { const result = runAll(testData.ControlledInverter); - expect(result.summary.passed).toBe(3); + expect(result.summary.passed).toBe(2); }); test('Equal Splitter working', () => { diff --git a/simulator/src/engine.js b/simulator/src/engine.js index d6ae7c689f..d1fdf0cbb7 100755 --- a/simulator/src/engine.js +++ b/simulator/src/engine.js @@ -408,9 +408,15 @@ export function play(scope = globalScope, resetNodes = false) { forceResetNodesSet(true); } } - // Check for TriState Contentions + + // Check for TriState and ControlledInverter Contentions if (simulationArea.contentionPending.length) { + if(simulationArea.contentionPending[0].objectType === 'TriState'){ showError('Contention at TriState'); + } + if(simulationArea.contentionPending[0].objectType === 'ControlledInverter'){ + showError('Contention at ControlledInverter'); + } forceResetNodesSet(true); errorDetectedSet(true); } diff --git a/simulator/src/modules/ControlledInverter.js b/simulator/src/modules/ControlledInverter.js index 5baa42b83c..6a5280effb 100755 --- a/simulator/src/modules/ControlledInverter.js +++ b/simulator/src/modules/ControlledInverter.js @@ -72,9 +72,14 @@ export default class ControlledInverter extends CircuitElement { (32 - this.bitWidth); simulationArea.simulationQueue.add(this.output1); } - if (this.state.value === 0) { - this.output1.value = undefined; - } + else { + if (this.output1.value !== undefined && this.output1.oldValue !== undefined && !simulationArea.contentionPending.contains(this)) { + this.output1.value = undefined; + simulationArea.simulationQueue.add(this.output1); + } + } + this.output1.oldValue = this.output1.value; + simulationArea.contentionPending.clean(this); } /** diff --git a/simulator/src/modules/TriState.js b/simulator/src/modules/TriState.js index 6799f4be41..344238f350 100755 --- a/simulator/src/modules/TriState.js +++ b/simulator/src/modules/TriState.js @@ -74,14 +74,13 @@ export default class TriState extends CircuitElement { this.output1.value = this.inp1.value; // >>>0)<<(32-this.bitWidth))>>>(32-this.bitWidth); simulationArea.simulationQueue.add(this.output1); } - simulationArea.contentionPending.clean(this); - } else if ( - this.output1.value !== undefined && - !simulationArea.contentionPending.contains(this) - ) { - this.output1.value = undefined; - simulationArea.simulationQueue.add(this.output1); + } else { + if (this.output1.value !== undefined && this.output1.oldValue !== undefined && !simulationArea. contentionPending.contains(this)) { + this.output1.value = undefined; + simulationArea.simulationQueue.add(this.output1); + } } + this.output1.oldValue = this.output1.value; simulationArea.contentionPending.clean(this); } diff --git a/simulator/src/node.js b/simulator/src/node.js index 4d12790175..e8c82d5bb9 100755 --- a/simulator/src/node.js +++ b/simulator/src/node.js @@ -360,8 +360,12 @@ export default class Node { if (this.type == NODE_OUTPUT && !this.subcircuitOverride) { if (this.parent.isResolvable() && !this.parent.queueProperties.inQueue) { - if (this.parent.objectType == 'TriState') { + if (this.parent.objectType == 'TriState' || this.parent.objectType == 'ControlledInverter') { if (this.parent.state.value) { simulationArea.simulationQueue.add(this.parent); } + else if (this.parent.state.value === 0) { + this.parent.output1.value = undefined; + simulationArea.simulationQueue.add(this.parent); + } } else { simulationArea.simulationQueue.add(this.parent); } @@ -392,6 +396,9 @@ export default class Node { if (node.parent.objectType == 'TriState' && node.value != undefined && node.type == 1) { if (node.parent.state.value) { simulationArea.contentionPending.push(node.parent); } } + if (node.parent.objectType == 'ControlledInverter' && node.value != undefined && node.type == 1) { + if (node.parent.state.value) { simulationArea.contentionPending.push(node.parent); } + } node.bitWidth = this.bitWidth; node.value = this.value;