From be0be659c1accba0cf3dea89e8e9e820216d9d3a Mon Sep 17 00:00:00 2001 From: Daniel Jones Date: Tue, 23 Jun 2020 16:34:19 +0930 Subject: first commit, basic logic works --- Gate.cpp | 104 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 Gate.cpp (limited to 'Gate.cpp') 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; + } +} -- cgit v1.2.3