wiRedPanda
Logic Circuit Simulator
Loading...
Searching...
No Matches
SRLatch.cpp
Go to the documentation of this file.
1// Copyright 2015 - 2026, GIBIS-UNIFESP and the wiRedPanda contributors
2// SPDX-License-Identifier: GPL-3.0-or-later
3
5
8#include "App/Wiring/Port.h"
9
10template<>
13 .type = ElementType::SRLatch,
14 .group = ElementGroup::Memory,
15 .minInputSize = 2,
16 .maxInputSize = 2,
17 .minOutputSize = 2,
18 .maxOutputSize = 2,
19 .canChangeAppearance = true,
20 };
21 static_assert(validate(constraints));
22
24 {
26 meta.pixmapPath = []{ return SRLatch::pixmapPath(); };
27 meta.titleText = QT_TRANSLATE_NOOP("SRLatch", "SR-LATCH");
28 meta.translatedName = QT_TRANSLATE_NOOP("SRLatch", "SR-Latch");
29 meta.trContext = "SRLatch";
30 return meta;
31 }
32
33 static inline const bool registered = []() {
35 ElementFactory::registerCreator(constraints.type, [] { return new SRLatch(); });
36 return true;
37 }();
38};
39
40SRLatch::SRLatch(QGraphicsItem *parent)
42{
43 // Call the most-derived override explicitly (see SRFlipFlop.cpp for rationale).
45}
46
48{
49 // SR latch: no clock, no asynchronous overrides — simplest bistable element.
50 // Both inputs are required (Set=1 → Q=1, Reset=1 → Q=0, both=1 is forbidden).
51 inputPort(0)->setPos(0, 16); inputPort(0)->setName("Set");
52 inputPort(1)->setPos(0, 48); inputPort(1)->setName("Reset");
53
54 outputPort(0)->setPos(64, 16); outputPort(0)->setName("Q");
55 outputPort(1)->setPos(64, 48); outputPort(1)->setName("~Q");
56
57 // Initial state: Q=0, ~Q=1
58 outputPort(0)->setDefaultStatus(Status::Inactive);
59 outputPort(1)->setDefaultStatus(Status::Active);
60}
61
63{
64 // Reload the pixmap before delegating to the base class (see SRFlipFlop.cpp).
67}
68
70{
71 if (!simUpdateInputs()) {
72 return;
73 }
74 Status q0 = simOutputs().at(0);
75 Status q1 = simOutputs().at(1);
76 const Status S = simInputs().at(0);
77 const Status R = simInputs().at(1);
78
79 if (S == Status::Active && R == Status::Active) {
80 q0 = Status::Inactive;
81 q1 = Status::Inactive;
82 } else if (S == Status::Active) {
83 q0 = Status::Active;
84 q1 = Status::Inactive;
85 } else if (R == Status::Active) {
86 q0 = Status::Inactive;
87 q1 = Status::Active;
88 }
89
90 setOutputValue(0, q0);
91 setOutputValue(1, q1);
92}
Singleton factory for all circuit element types.
Self-registering element trait template and compile-time constraint validation.
ElementMetadata metadataFromConstraints(const ElementConstraints &c)
Converts ElementConstraints to an ElementMetadata with all constraint-derived fields set.
Definition ElementInfo.h:80
constexpr bool validate(const ElementConstraints &c)
Validates element constraints at compile time.
Definition ElementInfo.h:48
Enums::ElementType ElementType
Definition Enums.h:107
Enums::Status Status
Definition Enums.h:106
Port classes: Port (base), InputPort, and OutputPort.
Graphic element for the SR latch.
static void registerCreator(ElementType type, std::function< GraphicElement *()> creator)
Registers a creator lambda for type, used by buildElement().
static void registerMetadata(const ElementMetadata &meta)
Registers meta in the global map (called once per element type at startup).
GraphicElement(ElementType type, QGraphicsItem *parent=nullptr)
Constructs a graphic element of the given type, fetching all properties from the metadata registry.
const QVector< Status > & simInputs() const
Read-only view of the cached simulation input values.
virtual void updateTheme()
Updates the element's visual theme according to the current dark/light palette.
void setOutputValue(const int index, const Status value)
Sets simulation output port index to value.
InputPort * inputPort(const int index=0) const
Returns the input port at index (default 0).
OutputPort * outputPort(const int index=0) const
Returns the output port at index (default 0).
bool simUpdateInputs()
Snapshots each predecessor's output into the simulation input cache.
const QVector< Status > & simOutputs() const
Read-only view of the current simulation output values.
void setPixmap(const QString &pixmapPath)
Loads and applies the pixmap located at pixmapPath.
void setDefaultStatus(const Status defaultStatus)
Sets the status applied when the port has no connection.
Definition Port.cpp:172
void setName(const QString &name)
Sets the label text shown next to the port.
Definition Port.cpp:166
Graphical representation of a level-sensitive SR latch.
Definition SRLatch.h:20
void updateLogic() override
Updates Q based on S and R inputs.
Definition SRLatch.cpp:69
SRLatch(QGraphicsItem *parent=nullptr)
Constructs the element with optional parent.
Definition SRLatch.cpp:40
void updatePortsProperties() override
Updates port names for this latch.
Definition SRLatch.cpp:47
static QString pixmapPath()
Definition SRLatch.h:31
void updateTheme() override
Refreshes the pixmap when the application theme changes.
Definition SRLatch.cpp:62
Compile-time-validatable subset of ElementMetadata.
Definition ElementInfo.h:21
static ElementMetadata metadata()
Definition SRLatch.cpp:23
static const bool registered
Definition SRLatch.cpp:33
static constexpr ElementConstraints constraints
Definition SRLatch.cpp:12
Self-registering element information trait.
Compile-time-registered properties for one element type.