diff --git a/include/IComponent.hpp b/include/IComponent.hpp index 712a125..d6cc958 100644 --- a/include/IComponent.hpp +++ b/include/IComponent.hpp @@ -31,4 +31,6 @@ namespace nts }; } +bool isTrueFalseComponent(const nts::IComponent& component); + #endif // ICOMPONENT_HPP \ No newline at end of file diff --git a/src/AComponent.cpp b/src/AComponent.cpp index 6c380b5..96876f1 100644 --- a/src/AComponent.cpp +++ b/src/AComponent.cpp @@ -6,10 +6,12 @@ */ #include "../include/AComponent.hpp" +#include "../include/specialComponents/True.hpp" +#include "../include/specialComponents/False.hpp" namespace nts { - AComponent::AComponent(const std::string &name, std::size_t nbPins) : _name(name), _lastTick(0), _nbPins(nbPins), _state(nts::UNDEFINED) + AComponent::AComponent(const std::string &name, std::size_t nbPins) : _name(name), _lastTick(1), _nbPins(nbPins), _state(nts::UNDEFINED) { _pins = std::vector>(nbPins); } @@ -33,4 +35,10 @@ namespace nts { _state = state; } -} \ No newline at end of file +} + +bool isTrueFalseComponent(const nts::IComponent& component) +{ + return dynamic_cast(&component) != nullptr + || dynamic_cast(&component) != nullptr; +} diff --git a/src/Circuit.cpp b/src/Circuit.cpp index fa796e0..5179f07 100644 --- a/src/Circuit.cpp +++ b/src/Circuit.cpp @@ -55,6 +55,10 @@ void nts::Circuit::displayInputs() const { for (const auto &component : _components) { + //check if it is true/false or if it is an actual input/clock + if (isTrueFalseComponent(*component.second)) + continue; + if (component.first == "true" || component.first == "false" || component.first == "undefined") continue; auto clock = dynamic_cast(component.second.get()); diff --git a/src/ShellLoop.cpp b/src/ShellLoop.cpp index 7271618..4965e46 100644 --- a/src/ShellLoop.cpp +++ b/src/ShellLoop.cpp @@ -82,6 +82,7 @@ void nts::ShellLoop::run() { std::string input; + _circuit.simulate(0); while (_running) { std::cout << "> "; if (!std::getline(std::cin, input)) { diff --git a/tests/test_elementaryComponents.cpp b/tests/test_elementaryComponents.cpp index 66fa578..fbcd6ef 100644 --- a/tests/test_elementaryComponents.cpp +++ b/tests/test_elementaryComponents.cpp @@ -46,6 +46,8 @@ Test(Circuit, and_gate_behavior) { circuit.linkComponents("In2", "And1", 1, 2); circuit.linkComponents("And1", "Out1", 3, 1); + circuit.simulate(0); // init components' values + circuit.setInputState(*dynamic_cast(circuit.getComponent("In1").get()), nts::TRUE); circuit.setInputState(*dynamic_cast(circuit.getComponent("In2").get()), nts::TRUE); @@ -98,6 +100,8 @@ Test(Circuit, or_gate_behavior) { circuit.linkComponents("In2", "Or1", 1, 2); circuit.linkComponents("Or1", "Out1", 3, 1); + circuit.simulate(0); // init components' values + circuit.setInputState(*dynamic_cast(circuit.getComponent("In1").get()), nts::TRUE); circuit.setInputState(*dynamic_cast(circuit.getComponent("In2").get()), nts::FALSE); circuit.simulate(1); @@ -158,6 +162,8 @@ Test(Circuit, not_gate_behavior) { circuit.linkComponents("In1", "Not1", 1, 1); circuit.linkComponents("Not1", "Out1", 2, 1); + circuit.simulate(0); // init components' values + circuit.setInputState(*dynamic_cast(circuit.getComponent("In1").get()), nts::TRUE); circuit.simulate(1); nts::Tristate state = circuit.compute("Out1"); @@ -180,6 +186,8 @@ Test(Circuit, xor_gate_behavior) { circuit.linkComponents("In2", "Xor1", 1, 2); circuit.linkComponents("Xor1", "Out1", 3, 1); + circuit.simulate(0); // init components' values + circuit.setInputState(*dynamic_cast(circuit.getComponent("In1").get()), nts::TRUE); circuit.setInputState(*dynamic_cast(circuit.getComponent("In2").get()), nts::FALSE); circuit.simulate(1); diff --git a/tests/test_special_components.cpp b/tests/test_special_components.cpp index 98992a5..ec90729 100644 --- a/tests/test_special_components.cpp +++ b/tests/test_special_components.cpp @@ -105,9 +105,10 @@ Test(Circuit, and_behavior) circuit.linkComponents("input1", "and", 1, 1); circuit.linkComponents("input2", "and", 1, 2); circuit.linkComponents("and", "output", 3, 1); + circuit.simulate(0); //done in the shellLoop to init components' values circuit.setInputState(*dynamic_cast(circuit.getComponent("input1").get()), nts::TRUE); circuit.setInputState(*dynamic_cast(circuit.getComponent("input2").get()), nts::TRUE); circuit.simulate(1); - cr_assert_eq(circuit.compute("output"), nts::TRUE, "Output should be TRUE"); + cr_assert_eq(circuit.compute("output"), nts::TRUE, "Output should be TRUE but is %d", circuit.compute("output")); } \ No newline at end of file