OpenASIP 2.2
Loading...
Searching...
No Matches
DefaultDecoderGenerator.hh
Go to the documentation of this file.
1/*
2 Copyright (c) 2002-2011 Tampere University.
3
4 This file is part of TTA-Based Codesign Environment (TCE).
5
6 Permission is hereby granted, free of charge, to any person obtaining a
7 copy of this software and associated documentation files (the "Software"),
8 to deal in the Software without restriction, including without limitation
9 the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 and/or sell copies of the Software, and to permit persons to whom the
11 Software is furnished to do so, subject to the following conditions:
12
13 The above copyright notice and this permission notice shall be included in
14 all copies or substantial portions of the Software.
15
16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 DEALINGS IN THE SOFTWARE.
23 */
24/**
25 * @file DefaultDecoderGenerator.hh
26 *
27 * Declaration of DefaultDecoderGenerator class.
28 *
29 * @author Lasse Laasonen 2005 (lasse.laasonen-no.spam-tut.fi)
30 * @author Pekka Jääskeläinen 2011
31 * @author Vinogradov Viacheslav(added Verilog generating) 2012
32 */
33
34#ifndef TTA_DEFAULT_DECODER_GENERATOR_HH
35#define TTA_DEFAULT_DECODER_GENERATOR_HH
36
37#include <string>
38#include <vector>
39#include <set>
40#include <map>
41
42#include "ProGeTypes.hh"
43#include "TCEString.hh"
44#include "Exception.hh"
45
46namespace TTAMachine {
47 class Machine;
48 class Unit;
49 class Bus;
50 class FunctionUnit;
51 class PortGuard;
52 class Guard;
53 class RegisterGuard;
54 class Socket;
55 class RegisterFile;
56 class RFPort;
57 class BaseFUPort;
58 class HWOperation;
59 class InstructionTemplate;
60 class BaseRegisterFile;
61 class ImmediateUnit;
62 class ControlUnit;
63}
64
65namespace ProGe {
66 class Netlist;
67 class NetlistGenerator;
68 class NetlistPort;
69 class NetlistBlock;
70}
71
72class BinaryEncoding;
73class GuardEncoding;
75class FUGuardEncoding;
76class SourceField;
77class SocketEncoding;
78class PortCode;
80class SlotField;
81
82
83/**
84 * Generates the default instruction decoder in VHDL.
85 */
87public:
90 const BinaryEncoding& bem,
91 const CentralizedControlICGenerator& icGenerator);
93
94 void setGenerateDebugger(bool generate);
95 void setGenerateNoLoopbackGlock(bool generate);
96 void setSyncReset(bool value);
97 void setGenerateBusEnable(bool value);
98
99 void SetHDL(ProGe::HDL language);
100
102 const ProGe::NetlistGenerator& nlGenerator,
103 ProGe::NetlistBlock& coreBlock);
105 const ProGe::NetlistGenerator& nlGenerator,
106 const std::string& dstDirectory);
107 std::set<int> requiredRFLatencies(
108 const TTAMachine::ImmediateUnit& iu) const;
109 void verifyCompatibility() const;
110 int glockRequestWidth() const;
111 int glockPortWidth() const;
112
113 void setGenerateLockTrace(bool generate);
114 void setLockTraceStartingCycle(unsigned int startCycle);
115
116 static const std::string RISCV_SIMM_PORT_IN_NAME;
117 static const std::string GLOCK_PORT_NAME;
118
119private:
120 /// Set type for buses.
121 typedef std::set<TTAMachine::Bus*> BusSet;
122 /// Types for mapping global lock and global lock request signals
123 typedef int GlockBitType;
124 typedef int GlockReqBitType;
125 typedef std::map<GlockBitType, const TTAMachine::Unit*>
127 typedef std::map<const TTAMachine::Unit*, GlockReqBitType>
129
132
133 void writeComment(std::ostream& stream, int indent,
134 std::string comment) const;
135 void writeSignalDeclaration(std::ostream& stream, ProGe::DataType type,
136 std::string sigName, int width) const;
137
138 void writeInstructionDecoder(std::ostream& stream);
139 ///void writeDecompressSignalsVHDL(std::ostream& stream) const; TBR
140 void writeLockDumpCode(std::ostream& stream) const;
141 void writeMoveFieldSignals(std::ostream& stream) const;
142 void writeImmediateSlotSignals(std::ostream& stream) const;
143 void writeLongImmediateTagSignal(std::ostream& stream) const;
144 void writeSquashSignals(std::ostream& stream) const;
145 void writeSocketCntrlSignals(std::ostream& stream);
146 void writeFUCntrlSignals(std::ostream& stream);
148 std::ostream& stream);
149 void writeRFCntrlSignals(std::ostream& stream);
150 void writeGlockHandlingSignals(std::ostream& stream) const;
151 void writePipelineFillSignals(std::ostream& stream) const;
152 void writeFullNOPConstant(std::ostream& stream) const;
153 std::string writeNOPEncodingVHDL() const;
154 //void writeDecompressTableVHDL(std::ostream& stream) const; TBR
155 void writeDismemberingAndITDecompression(std::ostream& stream) const;
156 void writeInstructionDismembering(std::ostream& stream) const;
157 void writeSquashSignalGenerationProcesses(std::ostream& stream) const;
159 const TTAMachine::Bus& bus,
160 std::ostream& stream) const;
161 void writeLongImmediateWriteProcess(std::ostream& stream) const;
162 void writeControlRegisterMappings(std::ostream& stream) const;
163 void writeRFSRAMDecodingProcess(std::ostream& stream) const;
164 void writeMainDecodingProcess(std::ostream& stream) const;
165 void writeGlockMapping(std::ostream& stream) const;
166 void writePipelineFillProcess(std::ostream& stream) const;
167 void writeResettingOfControlRegisters(std::ostream& stream) const;
168 void writeInstructionDecoding(std::ostream& stream) const;
169 void writeRulesForSourceControlSignals(std::ostream& stream) const;
170 void writeRulesForDestinationControlSignals(std::ostream& stream) const;
171// void writeCUOpcodeSettings(
172// std::ostream& stream, const TTAMachine::ControlUnit& cu) const;
174 const TTAMachine::Bus& bus, std::ostream& stream) const;
176 const TTAMachine::Socket& socket,
177 std::ostream& stream) const;
179 const TTAMachine::Bus& bus,
180 std::ostream& stream) const;
182 const TTAMachine::RFPort& port,
183 std::ostream& stream) const;
185 const TTAMachine::BaseFUPort& port,
186 std::ostream& stream) const;
188 const TTAMachine::BaseFUPort& port,
189 std::ostream& stream) const;
191 const TTAMachine::RFPort& port,
192 std::ostream& stream) const;
194 const ProGe::HDL language,
196 int indLevel,
197 std::ostream& stream) const;
199 const std::set<TTAMachine::Socket*> outputSockets,
200 std::ostream& stream) const;
201
203 const ProGe::HDL language,
204 const TTAMachine::Bus& bus,
205 const GuardEncoding& enc,
206 const TTAMachine::Guard& guard,
207 std::ostream& stream,
208 int indLevel);
209 static bool containsSimilarGuard(
210 const std::set<TTAMachine::PortGuard*>& guardSet,
211 const TTAMachine::PortGuard& guard);
212 static bool containsSimilarGuard(
213 const std::set<TTAMachine::RegisterGuard*>& guardSet,
214 const TTAMachine::RegisterGuard& guard);
215 static bool needsBusControl(const TTAMachine::Socket& socket);
216 static bool needsDataControl(const TTAMachine::Socket& socket);
217
219 const GPRGuardEncoding& encoding) const;
220 TTAMachine::PortGuard& findGuard(const FUGuardEncoding& encoding) const;
221
222 static std::string simmDataPort(const std::string& busName);
223 static std::string simmControlPort(const std::string& busName);
224 static int simmPortWidth(const TTAMachine::Bus& bus);
225 static std::string simmDataSignalName(const std::string& busName);
226 static std::string simmCntrlSignalName(const std::string& busName);
227 static std::string fuLoadCntrlPort(
228 const std::string& fuName,
229 const std::string& portName);
230 static std::string fuLoadSignalName(
231 const std::string& fuName,
232 const std::string& portName);
233 static std::string fuOpcodeCntrlPort(const std::string& fu);
234 static std::string fuOpcodeSignalName(const std::string& fu);
235 static std::string rfLoadCntrlPort(
236 const std::string& rfName,
237 const std::string& portName);
238 static std::string rfLoadSignalName(
239 const std::string& rfName,
240 const std::string& portName,
241 bool async = false);
242 static std::string rfOpcodeSignalName(
243 const std::string& rfName,
244 const std::string& portName,
245 bool async = false);
246 static std::string rfOpcodeCntrlPort(
247 const std::string& rfName,
248 const std::string& portName);
249 static std::string iuReadOpcodeCntrlPort(
250 const std::string& unitName,
251 const std::string& portName);
252 static std::string iuReadOpcodeCntrlSignal(
253 const std::string& unitName,
254 const std::string& portName);
255 static std::string iuReadLoadCntrlPort(
256 const std::string& unitName,
257 const std::string& portName);
258 static std::string iuReadLoadCntrlSignal(
259 const std::string& unitName,
260 const std::string& portName);
261 static std::string iuWritePort(const std::string& iuName);
262 static std::string iuWriteSignal(const std::string& iuName);
263 static std::string iuWriteOpcodeCntrlPort(
264 const std::string& unitName);
265 static std::string iuWriteOpcodeCntrlSignal(
266 const std::string& unitName);
267 static std::string iuWriteLoadCntrlPort(
268 const std::string& unitName);
269 static std::string iuWriteLoadCntrlSignal(
270 const std::string& unitName);
271 static std::string busMuxCntrlSignal(const TTAMachine::Bus& bus);
272 static std::string busMuxCntrlRegister(const TTAMachine::Bus& bus);
273 static std::string busMuxEnableSignal(const TTAMachine::Bus& bus);
274 static std::string busMuxEnableRegister(const TTAMachine::Bus& bus);
275
276 static std::string socketBusControlPort(const std::string& name);
277 static std::string socketDataControlPort(const std::string& name);
278 static std::string moveFieldSignal(const std::string& busName);
279 static std::string guardPortName(const TTAMachine::Guard& guard);
280 static std::string srcFieldSignal(const std::string& busName);
281 static std::string dstFieldSignal(const std::string& busName);
282 static std::string guardFieldSignal(const std::string& busName);
283 static std::string immSlotSignal(const std::string& immSlot);
284 static std::string squashSignal(const std::string& busName);
285 static std::string socketBusCntrlSignalName(const std::string& name);
286 static std::string socketDataCntrlSignalName(const std::string& name);
287 static std::string gcuDataPort(const std::string& nameInADF);
288
289 int opcodeWidth(const TTAMachine::FunctionUnit& fu) const;
290 static int busControlWidth(const TTAMachine::Socket& socket);
291 static int dataControlWidth(const TTAMachine::Socket& socket);
292 static int rfOpcodeWidth(const TTAMachine::BaseRegisterFile& rf);
293
294 static BusSet connectedBuses(const TTAMachine::Socket& socket);
295 static std::string socketEncodingCondition(
296 const ProGe::HDL language,
297 const SlotField& srcField,
298 const std::string& socketName);
299 static std::string portCodeCondition(
300 const ProGe::HDL language,
301 const SocketEncoding& socketEnc,
302 const PortCode& code);
304 const ProGe::HDL language,
305 const std::string& iTempName) const;
306 static std::string rfOpcodeFromSrcOrDstField(
307 const ProGe::HDL language,
308 const SocketEncoding& socketEnc,
309 const PortCode& code);
310
311 std::string busCntrlSignalPinOfSocket(
312 const TTAMachine::Socket& socket,
313 const TTAMachine::Bus& bus) const;
314 int opcode(const TTAMachine::HWOperation& operation) const;
315 static std::string indentation(unsigned int level);
316 bool sacEnabled(const std::string& rfName) const;
317
318 /// The machine.
320 /// The binary encoding map.
322 /// The IC generator.
324 /// The netlist generator.
326 /// The instruction decoder block in the netlist.
328 /// Tells whether to generate global lock tracing code.
332 /// Generate debugger signals?
334 /// Reset synchronously (otherwise asynchronous)
336 /// Bus enable signals for bustrace
338 /// The starting cycle for bus tracing.
340 /// The flag to generate global lock request handling in decoder.
341 /// False means delegating the lock request towards instruction fetch.
343 /// Maps connected glock port bits to associated TTA Units
345 /// Maps TTA Units to associated glock request port bits.
347
348 /// Bookkeeping for reset-needing signals
349 std::vector<std::string> registerVectors;
350 std::vector<std::string> registerBits;
351};
352
353#endif
354
TTAMachine::Machine * machine
the architecture definition of the estimated processor
void writeImmediateSlotSignals(std::ostream &stream) const
static std::string busMuxEnableRegister(const TTAMachine::Bus &bus)
bool generateAlternateGlockReqHandling_
The flag to generate global lock request handling in decoder. False means delegating the lock request...
static std::string socketDataControlPort(const std::string &name)
static void writeSquashSignalSubstitution(const ProGe::HDL language, const TTAMachine::Bus &bus, const GuardEncoding &enc, const TTAMachine::Guard &guard, std::ostream &stream, int indLevel)
void writeMainDecodingProcess(std::ostream &stream) const
void writeFullNOPConstant(std::ostream &stream) const
static std::string guardFieldSignal(const std::string &busName)
std::string writeNOPEncodingVHDL() const
void writeControlRulesOfRFWritePort(const TTAMachine::RFPort &port, std::ostream &stream) const
static std::string indentation(unsigned int level)
std::string instructionTemplateCondition(const ProGe::HDL language, const std::string &iTempName) const
static std::string squashSignal(const std::string &busName)
static std::string iuWriteLoadCntrlSignal(const std::string &unitName)
void writeResettingOfControlRegisters(std::ostream &stream) const
TTAMachine::RegisterGuard & findGuard(const GPRGuardEncoding &encoding) const
unsigned int lockTraceStartingCycle_
The starting cycle for bus tracing.
void writeSimmDataSignal(const TTAMachine::Bus &bus, std::ostream &stream) const
void writeSignalDeclaration(std::ostream &stream, ProGe::DataType type, std::string sigName, int width) const
void completeDecoderBlock(const ProGe::NetlistGenerator &nlGenerator, ProGe::NetlistBlock &coreBlock)
static BusSet connectedBuses(const TTAMachine::Socket &socket)
static std::string iuWriteOpcodeCntrlPort(const std::string &unitName)
void writeInstructionTemplateProcedures(const ProGe::HDL language, const TTAMachine::InstructionTemplate &iTemp, int indLevel, std::ostream &stream) const
static const std::string RISCV_SIMM_PORT_IN_NAME
static std::string busMuxCntrlSignal(const TTAMachine::Bus &bus)
const CentralizedControlICGenerator & icGenerator_
The IC generator.
static int busControlWidth(const TTAMachine::Socket &socket)
void writeInstructionDismembering(std::ostream &stream) const
UnitGlockReqBitMapType unitGlockReqBitMap_
Maps TTA Units to associated glock request port bits.
static std::string fuLoadCntrlPort(const std::string &fuName, const std::string &portName)
ProGe::NetlistBlock * decoderBlock_
The instruction decoder block in the netlist.
static std::string moveFieldSignal(const std::string &busName)
void writeLongImmediateWriteProcess(std::ostream &stream) const
const BinaryEncoding & bem_
The binary encoding map.
bool syncReset_
Reset synchronously (otherwise asynchronous)
void writeRFSRAMDecodingProcess(std::ostream &stream) const
static std::string iuWriteSignal(const std::string &iuName)
static int rfOpcodeWidth(const TTAMachine::BaseRegisterFile &rf)
std::set< TTAMachine::Bus * > BusSet
Set type for buses.
static std::string iuWriteLoadCntrlPort(const std::string &unitName)
void SetHDL(ProGe::HDL language)
static std::string dstFieldSignal(const std::string &busName)
void writeGlockHandlingSignals(std::ostream &stream) const
static std::string socketEncodingCondition(const ProGe::HDL language, const SlotField &srcField, const std::string &socketName)
void writeInstructionDecoder(std::ostream &stream)
void writeSquashSignalGenerationProcesses(std::ostream &stream) const
static std::string rfOpcodeSignalName(const std::string &rfName, const std::string &portName, bool async=false)
void writePipelineFillProcess(std::ostream &stream) const
static std::string rfLoadCntrlPort(const std::string &rfName, const std::string &portName)
static std::string simmCntrlSignalName(const std::string &busName)
void writeSquashSignalGenerationProcess(const TTAMachine::Bus &bus, std::ostream &stream) const
static std::string iuReadLoadCntrlPort(const std::string &unitName, const std::string &portName)
void writeSocketCntrlSignals(std::ostream &stream)
static std::string iuWritePort(const std::string &iuName)
static std::string iuReadOpcodeCntrlSignal(const std::string &unitName, const std::string &portName)
static std::string iuReadOpcodeCntrlPort(const std::string &unitName, const std::string &portName)
void writeInstructionDecoding(std::ostream &stream) const
static bool containsSimilarGuard(const std::set< TTAMachine::PortGuard * > &guardSet, const TTAMachine::PortGuard &guard)
void writeDismemberingAndITDecompression(std::ostream &stream) const
static std::string portCodeCondition(const ProGe::HDL language, const SocketEncoding &socketEnc, const PortCode &code)
void writeSquashSignals(std::ostream &stream) const
static std::string rfOpcodeCntrlPort(const std::string &rfName, const std::string &portName)
bool sacEnabled(const std::string &rfName) const
static int dataControlWidth(const TTAMachine::Socket &socket)
void writeRulesForDestinationControlSignals(std::ostream &stream) const
static std::string immSlotSignal(const std::string &immSlot)
void writeComment(std::ostream &stream, int indent, std::string comment) const
static std::string fuOpcodeSignalName(const std::string &fu)
void setLockTraceStartingCycle(unsigned int startCycle)
void writePipelineFillSignals(std::ostream &stream) const
static std::string simmDataPort(const std::string &busName)
static std::string gcuDataPort(const std::string &nameInADF)
std::vector< std::string > registerVectors
Bookkeeping for reset-needing signals.
static std::string socketBusControlPort(const std::string &name)
UnitGlockBitMapType unitGlockBitMap_
Maps connected glock port bits to associated TTA Units.
void writeMoveFieldSignals(std::ostream &stream) const
bool generateDebugger_
Generate debugger signals?
void writeBusControlRulesOfSImmSocketOfBus(const TTAMachine::Bus &bus, std::ostream &stream) const
void writeControlRulesOfFUInputPort(const TTAMachine::BaseFUPort &port, std::ostream &stream) const
static std::string iuWriteOpcodeCntrlSignal(const std::string &unitName)
static std::string rfLoadSignalName(const std::string &rfName, const std::string &portName, bool async=false)
void writeLockDumpCode(std::ostream &stream) const
void writeDecompressSignalsVHDL(std::ostream& stream) const; TBR
static const std::string GLOCK_PORT_NAME
static std::string rfOpcodeFromSrcOrDstField(const ProGe::HDL language, const SocketEncoding &socketEnc, const PortCode &code)
static bool needsDataControl(const TTAMachine::Socket &socket)
void writeGlockMapping(std::ostream &stream) const
static int simmPortWidth(const TTAMachine::Bus &bus)
const ProGe::NetlistGenerator * nlGenerator_
The netlist generator.
void generateInstructionDecoder(const ProGe::NetlistGenerator &nlGenerator, const std::string &dstDirectory)
void writeRulesForSourceControlSignals(std::ostream &stream) const
void writeRFCntrlSignals(std::ostream &stream)
std::set< int > requiredRFLatencies(const TTAMachine::ImmediateUnit &iu) const
void setGenerateLockTrace(bool generate)
std::string busCntrlSignalPinOfSocket(const TTAMachine::Socket &socket, const TTAMachine::Bus &bus) const
static std::string socketDataCntrlSignalName(const std::string &name)
void setGenerateNoLoopbackGlock(bool generate)
int GlockBitType
Types for mapping global lock and global lock request signals.
std::map< const TTAMachine::Unit *, GlockReqBitType > UnitGlockReqBitMapType
void writeControlRulesOfRFReadPort(const TTAMachine::RFPort &port, std::ostream &stream) const
static std::string socketBusCntrlSignalName(const std::string &name)
static std::string srcFieldSignal(const std::string &busName)
static std::string fuLoadSignalName(const std::string &fuName, const std::string &portName)
int opcode(const TTAMachine::HWOperation &operation) const
void writeBusMuxControlLogic(const TTAMachine::Bus &bus, const std::set< TTAMachine::Socket * > outputSockets, std::ostream &stream) const
void writeControlRulesOfFUOutputPort(const TTAMachine::BaseFUPort &port, std::ostream &stream) const
static std::string fuOpcodeCntrlPort(const std::string &fu)
static std::string guardPortName(const TTAMachine::Guard &guard)
std::vector< std::string > registerBits
static std::string iuReadLoadCntrlSignal(const std::string &unitName, const std::string &portName)
static bool needsBusControl(const TTAMachine::Socket &socket)
static std::string simmControlPort(const std::string &busName)
void setGenerateDebugger(bool generate)
void writeLongImmediateTagSignal(std::ostream &stream) const
static std::string simmDataSignalName(const std::string &busName)
bool generateLockTrace_
Tells whether to generate global lock tracing code.
static std::string busMuxCntrlRegister(const TTAMachine::Bus &bus)
static std::string busMuxEnableSignal(const TTAMachine::Bus &bus)
bool generateBusEnable_
Bus enable signals for bustrace.
void writeControlRegisterMappings(std::ostream &stream) const
int opcodeWidth(const TTAMachine::FunctionUnit &fu) const
void writeFUCntrlSignals(std::ostream &stream)
const TTAMachine::Machine & machine_
The machine.
std::map< GlockBitType, const TTAMachine::Unit * > UnitGlockBitMapType
void writeBusControlRulesOfOutputSocket(const TTAMachine::Socket &socket, std::ostream &stream) const
Definition FUGen.hh:54
DataType
Data types of hardware ports.
Definition ProGeTypes.hh:46
HDL
HDLs supported by ProGe.
Definition ProGeTypes.hh:40