summaryrefslogtreecommitdiff
path: root/Gate.cpp
diff options
context:
space:
mode:
authorDaniel Jones <admin@danieljon.es>2020-06-23 16:34:19 +0930
committerDaniel Jones <admin@danieljon.es>2020-06-23 16:34:19 +0930
commitbe0be659c1accba0cf3dea89e8e9e820216d9d3a (patch)
tree94f6bed9a00f0d5be3ee13414a5beadfc1d3d24a /Gate.cpp
downloadfoxlogicgates-be0be659c1accba0cf3dea89e8e9e820216d9d3a.tar.gz
foxlogicgates-be0be659c1accba0cf3dea89e8e9e820216d9d3a.zip
first commit, basic logic works
Diffstat (limited to 'Gate.cpp')
-rw-r--r--Gate.cpp104
1 files changed, 104 insertions, 0 deletions
diff --git a/Gate.cpp b/Gate.cpp
new file mode 100644
index 0000000..0aaed25
--- /dev/null
+++ b/Gate.cpp
@@ -0,0 +1,104 @@
+#include "Gate.h"
+
+int Gate::gate_id_counter = 0;
+
+Gate::Gate(GATE_TYPE type, int x, int y, int width, int height)
+{
+ this->gate_type = type;
+ this->input_gate1 = nullptr;
+ this->input_gate2 = nullptr;
+ this->output_gate = nullptr;
+ this->id = Gate::gate_id_counter++; // increment counter after assigning
+ this->x = x;
+ this->y = y;
+ this->w = width;
+ this->h = height;
+}
+
+Gate::~Gate() {}
+
+void Gate::update_state()
+{
+ switch (this->gate_type)
+ {
+ case INPUT:
+ {
+ /* we're a simple input, do nothing */
+ break;
+ }
+
+ case OUTPUT:
+ {
+ /* we're a simple output, do nothing */
+ if (input_gate1 && input_gate1->get_output_state() == true)
+ {
+ this->output_state = true;
+ }
+ else if (input_gate1)
+ {
+ this->output_state = false;
+ }
+ break;
+ }
+
+
+ case AND:
+ {
+ if (!input_gate1 || !input_gate2) {this->output_state = false; return; }
+ output_state = input_gate1->get_output_state() & input_gate2->get_output_state();
+ break;
+ }
+
+
+ case OR:
+ {
+ if (!input_gate1 || !input_gate2) {this->output_state = false; return; }
+ output_state = input_gate1->get_output_state() | input_gate2->get_output_state();
+ break;
+ }
+
+
+ case NOT:
+ {
+ /* NOT only cares for input 1 */
+ if (!input_gate1) {this->output_state = false; return; }
+ output_state = !input_gate1->get_output_state();
+ break;
+ }
+
+
+ case NAND:
+ {
+ if (!input_gate1 || !input_gate2) {this->output_state = false; return; }
+ output_state = ~(input_gate1->get_output_state() & input_gate2->get_output_state());
+ break;
+ }
+
+
+ case NOR:
+ {
+ if (!input_gate1 || !input_gate2) {this->output_state = false; return; }
+ output_state = ~(input_gate1->get_output_state() | input_gate2->get_output_state());
+ break;
+ }
+
+
+ case XOR:
+ {
+ if (!input_gate1 || !input_gate2) {this->output_state = false; return; }
+ output_state = input_gate1->get_output_state() ^ input_gate2->get_output_state();
+ break;
+ }
+
+
+ case XNOR:
+ {
+ if (!input_gate1 || !input_gate2) {this->output_state = false; return; }
+ output_state = ~(input_gate1->get_output_state() ^ input_gate2->get_output_state());
+ break;
+ }
+
+ default:
+ break;
+ }
+}