wiRedPanda
Logic Circuit Simulator
Loading...
Searching...
No Matches
ArduinoCodeGen.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
7
8#pragma once
9
10#include <QCoreApplication>
11#include <QFile>
12#include <QHash>
13#include <QTextStream>
14#include <QVector>
15
16#include "App/Core/Enums.h"
17
18class GraphicElement;
19class IC;
20class InputPort;
21class Port;
22
28{
29public:
31 MappedPin() = default;
40 MappedPin(GraphicElement *elm, const QString &pin, const QString &varName, Port *port, const int portNumber = 0)
41 : m_elm(elm)
42 , m_port(port)
43 , m_pin(pin)
44 , m_varName(varName)
45 , m_portNumber(portNumber)
46 {
47 }
48
50 Port *m_port = nullptr;
51 QString m_pin;
52 QString m_varName;
53 int m_portNumber = 0;
54};
55
61{
62 QString name;
63 QStringList availablePins;
64 QString description;
66 qsizetype maxPins() const { return availablePins.size(); }
67};
68
77{
78 Q_DECLARE_TR_FUNCTIONS(ArduinoCodeGen)
79
80public:
81 // --- Lifecycle ---
82
86 struct TestVector {
87 QVector<bool> inputs;
88 QVector<bool> outputs;
89 };
90
96 ArduinoCodeGen(const QString &fileName, const QVector<GraphicElement *> &elements);
97
98 // --- Code Generation ---
99
101 void generate();
102 void generateTestbench(const QString &tbFileName, const QVector<TestVector> &vectors);
103
104private:
105 // --- String Utilities ---
106
108 static QString highLow(Status val);
110 static QString removeForbiddenChars(const QString &input);
112 static bool isArduinoReserved(const QString &name);
113
114 // --- Board Selection ---
115
117 ArduinoBoardConfig selectBoard(int requiredPins);
119 QVector<ArduinoBoardConfig> availableBoards() const;
120
121 // --- Signal Name Resolution ---
122
124 QString buildSelectExpression(GraphicElement *elm, int startIndex, int numSelectLines);
126 QString otherPortName(Port *port);
127 QString otherPortNameImpl(Port *port, QSet<Port *> &visited);
128 void emitFlipFlopBlock(GraphicElement *elm, const QString &typeName, const QString &firstOut,
129 const QString &secondOut, int clockInputIndex, int presetInputIndex,
130 int clearInputIndex, const std::function<void()> &edgeLogic,
131 const std::function<void()> &stateEpilogue = {});
135 static bool hasNativeMemory(const QVector<GraphicElement *> &elements);
139 void emitCommitFlipFlops();
140 void emitCommitFlipFlopsRec(const QVector<GraphicElement *> &elements);
143 void emitTickDriver();
144 void emitDFlipFlop(GraphicElement *elm, const QString &firstOut);
145 void emitDLatch(GraphicElement *elm, const QString &firstOut);
146 void emitJKFlipFlop(GraphicElement *elm, const QString &firstOut);
147 void emitSRFlipFlop(GraphicElement *elm, const QString &firstOut);
148 void emitTFlipFlop(GraphicElement *elm, const QString &firstOut);
149 void emitSRLatch(GraphicElement *elm, const QString &firstOut);
150 void emitMux(GraphicElement *elm);
151 void emitDemux(GraphicElement *elm);
152 void emitTruthTable(GraphicElement *elm);
153 void assignLogicOperator(GraphicElement *elm);
154
155 // --- Variable / Declaration Emission ---
156
158 void assignVariablesRec(const QVector<GraphicElement *> &elements);
160 void declareAuxVariables();
162 void declareAuxVariablesRec(const QVector<GraphicElement *> &elements, const bool isBox, const QString &icPrefix);
167 void declareSequentialStateRec(const QVector<GraphicElement *> &elements, bool topLevel);
168 void declareInputs();
170 void declareOutputs();
171 void emitComputeLogicFunction();
172 void loop();
174 void setup();
175
176 // --- Members ---
177
178 QFile m_file;
179 QHash<Port *, QString> m_varMap;
180 QHash<QString, InputPort *> m_txInputPorts;
181 QStringList m_availablePins;
182 QStringList m_declaredVariables;
183 QTextStream m_stream;
184 QVector<MappedPin> m_inputMap;
185 QVector<MappedPin> m_outputMap;
186 const QVector<GraphicElement *> m_elements;
187 IC *m_currentIC = nullptr;
188 ArduinoBoardConfig m_selectedBoard;
189 int m_totalRequiredPins = 0;
190 bool m_hasSequential = false;
191
194 [[noreturn]] void throwPinOverflow() const;
195};
Central enumeration types for element types, groups, and signal status.
Enums::Status Status
Definition Enums.h:106
void generate()
Generates the Arduino sketch and writes it to the output file.
void generateTestbench(const QString &tbFileName, const QVector< TestVector > &vectors)
ArduinoCodeGen(const QString &fileName, const QVector< GraphicElement * > &elements)
Constructs the code generator targeting fileName.
Abstract base class for all graphical circuit elements in wiRedPanda.
Graphic element representing an Integrated Circuit (sub-circuit) box.
Definition IC.h:31
A port that receives a signal (the destination end of a wire).
Definition Port.h:229
GraphicElement * m_elm
QString m_pin
Port * m_port
MappedPin()=default
Constructs a default (empty) MappedPin.
QString m_varName
MappedPin(GraphicElement *elm, const QString &pin, const QString &varName, Port *port, const int portNumber=0)
Constructs a MappedPin for a given element port.
Abstract base class for circuit element ports (connection endpoints).
Definition Port.h:39
Describes an Arduino board's available GPIO pins.
qsizetype maxPins() const
Returns the total number of available pins.
QString name
Board name (e.g. "Arduino Uno").
QStringList availablePins
Ordered list of usable pin labels.
Describes a single test vector for testbench generation.
QVector< bool > inputs
Input pin values.
QVector< bool > outputs
Expected output pin values.