OpenASIP 2.2
Loading...
Searching...
No Matches
RV32MicroCodeGenerator.hh
Go to the documentation of this file.
1/*
2 Copyright (C) 2021-2022 Tampere University.
3
4 This library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Lesser General Public
6 License as published by the Free Software Foundation; either
7 version 2.1 of the License, or (at your option) any later version.
8
9 This library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Lesser General Public License for more details.
13
14 You should have received a copy of the GNU Lesser General Public
15 License along with this library; if not, write to the Free Software
16 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17 */
18/**
19 * @file RV32MicroCodeGenerator.hh
20 *
21 * Declaration of RV32MicroCodeGenerator class.
22 *
23 * @author Kari Hepola 2021-2022 (kari.hepola@tuni.fi)
24 * @note rating: red
25 */
26
27#ifndef TTA_RV32_TRANSLATOR_HH
28#define TTA_RV32_TRANSLATOR_HH
29
30
31#include <string>
32#include <vector>
33#include <unordered_map>
34#include <map>
35#include <set>
36
37#include "MicroCodeGenerator.hh"
39
40namespace TTAMachine {
41 class Machine;
42 class Socket;
43 class Bus;
44 class RFPort;
45 class FUPort;
46 class BaseFUPort;
47 class FunctionUnit;
48 class RegisterFile;
49 class Port;
51}
52
53namespace TTAProgram {
54 class Instruction;
55}
56
58class BinaryEncoding;
61
62using namespace TTAMachine;
63using namespace TTAProgram;
64
65namespace ProGe {
66
68
69public:
71 const std::string& entityName);
73
74 void generateRTL(HDLTemplateInstantiator& instantiator,
75 const std::string& fileDst);
76
77 void setBypassInstructionRegister(const bool& value);
78
79
80private:
81 std::unordered_map<std::string, BaseFUPort*> rs1Ports_;
82 std::unordered_map<std::string, BaseFUPort*> rs2Ports_;
83 std::unordered_map<std::string, BaseFUPort*> rdPorts_;
84 std::unordered_map<std::string, BaseFUPort*> simmPorts_;
85
87
88 std::unordered_map<Port*, int> sourcePortID_;
89
90 std::unordered_map<Port*, std::vector<std::string>>
92
94
95 void generateFUTargetProcess(std::ofstream& stream);
96
97 void addRs1ForwardingConditions(std::map<std::string, std::string>
98 ops, std::unordered_map<std::string, InstructionBitVector*>
99 (ProGe::RV32MicroCodeGenerator::*instructionFunc)(Port* p1, Port* p2) const,
100 std::ofstream& stream) const;
101
102 void addRs2ForwardingConditions(std::map<std::string, std::string>
103 ops, std::unordered_map<std::string, InstructionBitVector*>
104 (ProGe::RV32MicroCodeGenerator::*instructionFunc)(Port* p1, Port* p2) const,
105 std::ofstream& stream) const;
106
108 instantiator);
109
110 std::map<std::string, std::string> rOperations_;
111 std::map<std::string, std::string> r1rOperations_;
112 std::map<std::string, std::string> r1Operations_;
113 std::map<std::string, std::string> iOperations_;
114 std::map<std::string, std::string> sOperations_;
115 std::map<std::string, std::string> bOperations_;
116 std::map<std::string, std::string> ujOperations_;
117
118
119 std::set<Port*> operationPorts(
120 const std::unordered_map<std::string, BaseFUPort*>& ports) const;
121
122 void validateOperations() const;
123
124 FunctionUnit* mapFunctionUnit(const std::string& operation) const;
125
126 void addR1Ports(const std::string& opName);
127 void addR1RPorts(const std::string& opName);
128 void addRPorts(const std::string& opName);
129 void addIPorts(const std::string& opName);
130 void addSPorts(const std::string& opName);
131 void addBPorts(const std::string& opName);
132 void addUJPorts(const std::string& opName);
133
134 void findOperationPorts();
135
136 void connectRF();
137 void findRF();
138
139 void findBusWidths();
140
142 Connection& rs2, Connection& rd, Connection& simm, const bool& forwarding)
143 const;
144
145 std::unordered_map<std::string, InstructionBitVector*>
146 constructRInstructions(Port* src1, Port* src2) const;
147 std::unordered_map<std::string, InstructionBitVector*>
148 constructIInstructions(Port* src1, Port* src2) const;
149 std::unordered_map<std::string, InstructionBitVector*>
150 constructSInstructions(Port* src1, Port* src2) const;
151 std::unordered_map<std::string, InstructionBitVector*>
152 constructBInstructions(Port* src1, Port* src2) const;
153 std::unordered_map<std::string, InstructionBitVector*>
155 std::unordered_map<std::string, InstructionBitVector*>
156 constructR1RInstructions(Port* src1, Port* src2) const;
157 std::unordered_map<std::string, InstructionBitVector*>
158 constructR1Instructions(Port* src1, Port* src2) const;
159
160 void addBitsToMap(
161 std::unordered_map<std::string, InstructionBitVector*> instructions,
162 const std::map<std::string, std::string> encodings,
163 std::ofstream& stream) const;
164
165 void generateMap(const std::string& dstDirectory);
166
167 void generateWrapper(HDLTemplateInstantiator& instantiator,
168 const std::string& fileDst);
169
170 void generateNOP();
171
172 void throwOperationNotFoundError(const std::string& op) const;
173
174 void throwTriggeringPortError(const BaseFUPort* port,
175 const std::string& type) const;
176
177 void throwInputPortError(const BaseFUPort* port,
178 const std::string& type) const;
179
180 void throwOutputPortError(const BaseFUPort* port,
181 const std::string& type) const;
182
184 const std::string& op, int required, int found) const;
185
186 std::vector<Bus*> busses_;
187
189
194
199
200
205
210
211
215
217
218 std::string NOP_;
224
225};
226}
227#endif
TTAMachine::Machine * machine
the architecture definition of the estimated processor
void addRs2ForwardingConditions(std::map< std::string, std::string > ops, std::unordered_map< std::string, InstructionBitVector * >(ProGe::RV32MicroCodeGenerator::*instructionFunc)(Port *p1, Port *p2) const, std::ofstream &stream) const
std::unordered_map< std::string, InstructionBitVector * > constructIInstructions(Port *src1, Port *src2) const
void generateWrapper(HDLTemplateInstantiator &instantiator, const std::string &fileDst)
void generateMap(const std::string &dstDirectory)
void addR1RPorts(const std::string &opName)
void addRs1ForwardingConditions(std::map< std::string, std::string > ops, std::unordered_map< std::string, InstructionBitVector * >(ProGe::RV32MicroCodeGenerator::*instructionFunc)(Port *p1, Port *p2) const, std::ofstream &stream) const
std::unordered_map< std::string, BaseFUPort * > rs1Ports_
FunctionUnit * mapFunctionUnit(const std::string &operation) const
bool findConnectedBusses(Connection &rs1, Connection &rs2, Connection &rd, Connection &simm, const bool &forwarding) const
void setBypassInstructionRegister(const bool &value)
std::unordered_map< std::string, BaseFUPort * > simmPorts_
std::unordered_map< std::string, BaseFUPort * > rdPorts_
std::string generateOperationLatencyLogic(HDLTemplateInstantiator &instantiator)
std::map< std::string, std::string > r1rOperations_
void throwOutputPortError(const BaseFUPort *port, const std::string &type) const
void addR1Ports(const std::string &opName)
std::map< std::string, std::string > r1Operations_
void addBitsToMap(std::unordered_map< std::string, InstructionBitVector * > instructions, const std::map< std::string, std::string > encodings, std::ofstream &stream) const
std::unordered_map< std::string, InstructionBitVector * > constructR1Instructions(Port *src1, Port *src2) const
void addRPorts(const std::string &opName)
void addSPorts(const std::string &opName)
void addUJPorts(const std::string &opName)
void generateRTL(HDLTemplateInstantiator &instantiator, const std::string &fileDst)
std::map< std::string, std::string > iOperations_
std::map< std::string, std::string > bOperations_
std::unordered_map< std::string, InstructionBitVector * > constructRInstructions(Port *src1, Port *src2) const
std::map< std::string, std::string > rOperations_
void throwOperationNotFoundError(const std::string &op) const
std::unordered_map< std::string, InstructionBitVector * > constructSInstructions(Port *src1, Port *src2) const
void generateFUTargetProcess(std::ofstream &stream)
std::map< std::string, std::string > sOperations_
std::unordered_map< std::string, BaseFUPort * > rs2Ports_
std::unordered_map< Port *, std::vector< std::string > > sourceOperationMap_
void throwTriggeringPortError(const BaseFUPort *port, const std::string &type) const
std::map< std::string, std::string > ujOperations_
std::unordered_map< std::string, InstructionBitVector * > constructR1RInstructions(Port *src1, Port *src2) const
void addIPorts(const std::string &opName)
std::unordered_map< Port *, int > sourcePortID_
void throwOperandCountError(const std::string &op, int required, int found) const
std::unordered_map< std::string, InstructionBitVector * > constructUJInstructions() const
std::set< Port * > operationPorts(const std::unordered_map< std::string, BaseFUPort * > &ports) const
std::unordered_map< std::string, InstructionBitVector * > constructBInstructions(Port *src1, Port *src2) const
void throwInputPortError(const BaseFUPort *port, const std::string &type) const
void addBPorts(const std::string &opName)
Definition FUGen.hh:54