wiRedPanda
Logic Circuit Simulator
Loading...
Searching...
No Matches
SystemVerilogCodeGen.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 <functional>
11
12#include <QCoreApplication>
13#include <QFile>
14#include <QHash>
15#include <QSet>
16#include <QTextStream>
17#include <QVector>
18
19#include "App/Core/Enums.h"
20
21class GraphicElement;
22class IC;
23class InputPort;
24class Port;
25
31{
32public:
42 MappedPinSystemVerilog(GraphicElement *elm, const QString &pin, const QString &varName, Port *port, const int portNumber = 0)
43 : m_elm(elm)
44 , m_port(port)
45 , m_pin(pin)
46 , m_varName(varName)
47 , m_portNumber(portNumber)
48 {
49 }
50
51 GraphicElement *m_elm = nullptr;
52 Port *m_port = nullptr;
53 QString m_pin;
54 QString m_varName;
55 int m_portNumber = 0;
56};
57
63 QString moduleName;
64 QString sourceFile;
65 QVector<QString> inputNames;
66 QVector<QString> outputNames;
67 IC *prototypeIC = nullptr;
68 bool generated = false;
69};
70
81{
82 Q_DECLARE_TR_FUNCTIONS(SystemVerilogCodeGen)
83
84public:
86 SystemVerilogCodeGen(const QString &fileName, const QVector<GraphicElement *> &elements);
87
89 void generate();
90
92 const QVector<MappedPinSystemVerilog> &inputMap() const { return m_inputMap; }
94 const QVector<MappedPinSystemVerilog> &outputMap() const { return m_outputMap; }
96 const QString &moduleName() const { return m_fileName; }
97
98private:
99 // --- String Utilities ---
100
102 static QString highLow(Status val);
104 static QString removeForbiddenChars(const QString &input);
106 static bool isSimpleIdentifier(const QString &expr);
107
108 // --- Signal Name Resolution ---
109
111 QString otherPortName(Port *port);
113 QString otherPortNameImpl(Port *port, QSet<Port *> &visited);
115 QString ensureSimpleSignal(const QString &expr);
116
117 // --- Variable / Declaration Emission ---
118
120 void assignVariablesRec(const QVector<GraphicElement *> &elements);
122 void collectICTypes(const QVector<GraphicElement *> &elements);
124 void declareAuxVariables();
126 void declareAuxVariablesRec(const QVector<GraphicElement *> &elements);
128 void declareInputs();
130 void declareOutputs();
131
132 // --- Sequential Logic Emission ---
133
135 void emitSequentialBlock(const QString &typeName,
136 const QString &clk, const QString &rawPrst, const QString &rawClr,
137 const std::function<void()> &emitPresetBody,
138 const std::function<void()> &emitClearBody,
139 const std::function<void()> &emitNormalBody);
140
141 // --- IC Module Generation ---
142
144 void generateICModules();
146 void generateSingleICModule(ICModuleInfo &info);
151 static QSet<GraphicElement *> findFeedbackElements(const QVector<GraphicElement *> &elements);
152
153 // --- Combinational Logic ---
154
156 QString generateLogicExpression(GraphicElement *elm);
158 QString generateLogicExpressionImpl(GraphicElement *elm, QSet<Port *> &visited);
159
160 // --- Top-Level Structure ---
161
163 void loop();
164
165 // --- Members ---
166
167 QFile m_file;
168 QHash<Port *, QString> m_varMap;
169 QHash<QString, InputPort *> m_txInputPorts;
170 QHash<QString, ICModuleInfo> m_icModules;
171 QHash<IC *, QString> m_instanceNames;
172 QStringList m_availablePins;
173 QString m_fileName;
174 QTextStream m_stream;
175 QVector<MappedPinSystemVerilog> m_inputMap;
176 QVector<MappedPinSystemVerilog> m_outputMap;
177 const QVector<GraphicElement *> m_elements;
178 bool m_generatingICModule = false;
179 int m_globalCounter = 1;
180 QSet<GraphicElement *> m_feedbackElements;
181};
Central enumeration types for element types, groups, and signal status.
Enums::Status Status
Definition Enums.h:106
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
QString m_varName
Generated internal signal name.
QString m_pin
Top-level module port name.
MappedPinSystemVerilog(GraphicElement *elm, const QString &pin, const QString &varName, Port *port, const int portNumber=0)
Constructs a pin mapping.
MappedPinSystemVerilog()=default
GraphicElement * m_elm
Owning graphic element.
int m_portNumber
Port index within the element.
Port * m_port
Source port in the circuit graph.
Abstract base class for circuit element ports (connection endpoints).
Definition Port.h:39
const QVector< MappedPinSystemVerilog > & inputMap() const
Returns the mapped input pins after generation.
SystemVerilogCodeGen(const QString &fileName, const QVector< GraphicElement * > &elements)
Constructs the code generator for the given output fileName and circuit elements.
void generate()
Generates the SystemVerilog output file for the circuit.
const QVector< MappedPinSystemVerilog > & outputMap() const
Returns the mapped output pins after generation.
const QString & moduleName() const
Returns the top-level module name derived from the file name.
Metadata for a single IC module during SystemVerilog hierarchical generation.
QString sourceFile
Original .panda file path (or blob name).
QString moduleName
Generated module identifier.
QVector< QString > inputNames
Port names for the module's inputs.
QVector< QString > outputNames
Port names for the module's outputs.
IC * prototypeIC
Representative IC element (used to inspect sub-circuit).
bool generated
True once the module body has been emitted.