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);
103
106 static QString fourState(Status val);
108 static QString removeForbiddenChars(const QString &input);
110 static bool isSimpleIdentifier(const QString &expr);
111
112 // --- Signal Name Resolution ---
113
115 QString otherPortName(Port *port);
117 QString otherPortNameImpl(Port *port, QSet<Port *> &visited);
119 QString ensureSimpleSignal(const QString &expr);
120
121 // --- Variable / Declaration Emission ---
122
124 void assignVariablesRec(const QVector<GraphicElement *> &elements);
126 void collectICTypes(const QVector<GraphicElement *> &elements);
128 void declareAuxVariables();
130 void declareAuxVariablesRec(const QVector<GraphicElement *> &elements);
132 void declareInputs();
134 void declareOutputs();
135
136 // --- Sequential Logic Emission ---
137
139 void emitSequentialBlock(const QString &typeName,
140 const QString &clk, const QString &rawPrst, const QString &rawClr,
141 const std::function<void()> &emitPresetBody,
142 const std::function<void()> &emitClearBody,
143 const std::function<void()> &emitNormalBody);
144
145 // --- IC Module Generation ---
146
148 void generateICModules();
150 void generateSingleICModule(ICModuleInfo &info);
155 static QSet<GraphicElement *> findFeedbackElements(const QVector<GraphicElement *> &elements);
156
157 // --- Combinational Logic ---
158
160 QString generateLogicExpression(GraphicElement *elm);
162 QString generateLogicExpressionImpl(GraphicElement *elm, QSet<Port *> &visited);
163
164 // --- Top-Level Structure ---
165
167 void loop();
168
169 // --- Members ---
170
171 QFile m_file;
172 QHash<Port *, QString> m_varMap;
173 QHash<QString, InputPort *> m_txInputPorts;
174 QHash<QString, ICModuleInfo> m_icModules;
175 QHash<IC *, QString> m_instanceNames;
176 QStringList m_availablePins;
177 QString m_fileName;
178 QTextStream m_stream;
179 QVector<MappedPinSystemVerilog> m_inputMap;
180 QVector<MappedPinSystemVerilog> m_outputMap;
181 const QVector<GraphicElement *> m_elements;
182 bool m_generatingICModule = false;
183 int m_globalCounter = 1;
184 QSet<GraphicElement *> m_feedbackElements;
185};
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:234
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.