wiRedPanda
Logic Circuit Simulator
Loading...
Searching...
No Matches
StatusOps.h
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
16
17#pragma once
18
19#include <QVector>
20
21#include "App/Core/Enums.h"
22
23namespace StatusOps {
24
26inline Status statusAnd(const Status a, const Status b)
27{
28 if (a == Status::Inactive || b == Status::Inactive) {
29 return Status::Inactive;
30 }
31 if (a == Status::Active && b == Status::Active) {
32 return Status::Active;
33 }
34 if (a == Status::Error || b == Status::Error) {
35 return Status::Error;
36 }
37 return Status::Unknown;
38}
39
41inline Status statusOr(const Status a, const Status b)
42{
43 if (a == Status::Active || b == Status::Active) {
44 return Status::Active;
45 }
46 if (a == Status::Inactive && b == Status::Inactive) {
47 return Status::Inactive;
48 }
49 if (a == Status::Error || b == Status::Error) {
50 return Status::Error;
51 }
52 return Status::Unknown;
53}
54
56inline Status statusNot(const Status a)
57{
58 if (a == Status::Active) {
59 return Status::Inactive;
60 }
61 if (a == Status::Inactive) {
62 return Status::Active;
63 }
64 return a;
65}
66
68inline Status statusXor(const Status a, const Status b)
69{
70 if ((a == Status::Active || a == Status::Inactive)
71 && (b == Status::Active || b == Status::Inactive)) {
72 return (a != b) ? Status::Active : Status::Inactive;
73 }
74 if (a == Status::Error || b == Status::Error) {
75 return Status::Error;
76 }
77 return Status::Unknown;
78}
79
81inline Status statusAndAll(const QVector<Status> &inputs)
82{
83 bool hasUnknown = false;
84 bool hasError = false;
85 for (const auto s : inputs) {
86 if (s == Status::Inactive) {
87 return Status::Inactive;
88 }
89 if (s == Status::Error) {
90 hasError = true;
91 } else if (s == Status::Unknown) {
92 hasUnknown = true;
93 }
94 }
95 if (hasError) { return Status::Error; }
96 return hasUnknown ? Status::Unknown : Status::Active;
97}
98
100inline Status statusOrAll(const QVector<Status> &inputs)
101{
102 bool hasUnknown = false;
103 bool hasError = false;
104 for (const auto s : inputs) {
105 if (s == Status::Active) {
106 return Status::Active;
107 }
108 if (s == Status::Error) {
109 hasError = true;
110 } else if (s == Status::Unknown) {
111 hasUnknown = true;
112 }
113 }
114 if (hasError) { return Status::Error; }
115 return hasUnknown ? Status::Unknown : Status::Inactive;
116}
117
120inline Status statusXorAll(const QVector<Status> &inputs)
121{
122 int activeCount = 0;
123 bool hasUnknown = false;
124 for (const auto s : inputs) {
125 if (s == Status::Active) {
126 ++activeCount;
127 } else if (s == Status::Error) {
128 return Status::Error;
129 } else if (s == Status::Unknown) {
130 hasUnknown = true;
131 }
132 }
133 if (hasUnknown) { return Status::Unknown; }
134 return (activeCount % 2 != 0) ? Status::Active : Status::Inactive;
135}
136
137} // namespace StatusOps
Central enumeration types for element types, groups, and signal status.
Enums::Status Status
Definition Enums.h:106
Status statusAnd(const Status a, const Status b)
AND: Inactive dominates all; unknown propagates as-is.
Definition StatusOps.h:26
Status statusXorAll(const QVector< Status > &inputs)
Definition StatusOps.h:120
Status statusOrAll(const QVector< Status > &inputs)
Fold OR over a range. Active dominates.
Definition StatusOps.h:100
Status statusAndAll(const QVector< Status > &inputs)
Fold AND over a range. Inactive dominates.
Definition StatusOps.h:81
Status statusXor(const Status a, const Status b)
XOR: requires all inputs known; any Unknown -> Unknown, any Error -> Error.
Definition StatusOps.h:68
Status statusOr(const Status a, const Status b)
OR: Active dominates all; unknown propagates as-is.
Definition StatusOps.h:41
Status statusNot(const Status a)
NOT: inverts known values; Unknown -> Unknown, Error -> Error.
Definition StatusOps.h:56