1/* GCompris - Comparator.qml
2 *
3 * SPDX-FileCopyrightText: 2016 Pulkit Gupta <pulkitnsit@gmail.com>
4 *
5 * Authors:
6 *   Bruno Coudoin <bruno.coudoin@gcompris.net> (GTK+ version)
7 *   Pulkit Gupta <pulkitnsit@gmail.com> (Qt Quick port)
8 *
9 *   SPDX-License-Identifier: GPL-3.0-or-later
10 */
11import QtQuick 2.9
12import GCompris 1.0
13
14ElectricalComponent {
15    id: comparator
16    terminalSize: 0.25
17    noOfInputs: 2
18    noOfOutputs: 3
19    property var inputTerminalPosY: [0.25, 0.75]
20    property var outputTerminalPosY: [0.13, 0.5, 0.87]
21
22    information: qsTr("A comparator takes 2 numbers as input, A and B. It compares them and outputs 3 " +
23                      "values. The first output is 1 if A < B, otherwise it's 0. The second output is 1 " +
24                      "if A = B, otherwise it's 0. The third output is 1 if A > B, otherwise it's 0. ")
25
26    truthTable: []
27
28    property alias inputTerminals: inputTerminals
29    property alias outputTerminals: outputTerminals
30
31    Repeater {
32        id: inputTerminals
33        model: 2
34        delegate: inputTerminal
35        Component {
36            id: inputTerminal
37            TerminalPoint {
38                posX: 0.05
39                posY: inputTerminalPosY[index]
40                type: "In"
41            }
42        }
43    }
44
45    Repeater {
46        id: outputTerminals
47        model: 3
48        delegate: outputTerminal
49        Component {
50            id: outputTerminal
51            TerminalPoint {
52                posX: 0.95
53                posY: outputTerminalPosY[index]
54                type: "Out"
55            }
56        }
57    }
58
59    function updateOutput(wireVisited) {
60        outputTerminals.itemAt(0).value = (inputTerminals.itemAt(0).value < inputTerminals.itemAt(1).value)
61        outputTerminals.itemAt(1).value = (inputTerminals.itemAt(0).value == inputTerminals.itemAt(1).value)
62        outputTerminals.itemAt(2).value = (inputTerminals.itemAt(0).value > inputTerminals.itemAt(1).value)
63
64        for(var i = 0 ; i < noOfOutputs ; ++i) {
65            var terminal = outputTerminals.itemAt(i)
66            for(var j = 0 ; j < terminal.wires.length ; ++j)
67                terminal.wires[j].to.value = terminal.value
68        }
69
70        var componentVisited = []
71        for(var i = 0 ; i < noOfOutputs ; ++i) {
72            var terminal = outputTerminals.itemAt(i)
73            for(var j = 0 ; j < terminal.wires.length ; ++j) {
74                var wire = terminal.wires[j]
75                var component = wire.to.parent
76                if(componentVisited[component] != true && wireVisited[wire] != true) {
77                    componentVisited[component] = true
78                    wireVisited[wire] = true
79                    component.updateOutput(wireVisited)
80                }
81            }
82        }
83    }
84}
85