OpenASIP 2.2
Loading...
Searching...
No Matches
MachineConnectivityCheck.hh
Go to the documentation of this file.
1/*
2 Copyright (c) 2002-2009 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 MachineConnectivityCheck.hh
26 *
27 * Declaration of MachineConnectivityCheck class.
28 *
29 * @author Pekka Jääskeläinen 2007 (pjaaskel-no.spam-cs.tut.fi)
30 * @note rating: red
31 */
32
33#ifndef TTA_MACHINE_CONNECTIVITY_CHECK_HH
34#define TTA_MACHINE_CONNECTIVITY_CHECK_HH
35
36#include <set>
37#include <map>
38#include <vector>
39
40#include "MachineCheck.hh"
41#include "ProgramAnnotation.hh"
42#include "MachinePart.hh"
43
44class TCEString;
45class MoveNode;
46class Operation;
47
48namespace TTAMachine {
49 class Port;
50 class Bus;
51 class RegisterFile;
52 class BaseRegisterFile;
53 class Unit;
54 class FunctionUnit;
55 class Guard;
56 class HWOperation;
57}
58
59namespace TTAProgram {
60 class TerminalImmediate;
61 class Move;
62}
63
64/**
65 * Base class for machine interconnection connectivity checks.
66 *
67 * Provides helper functions that are useful for many derived checks.
68 */
70public:
71 typedef std::set<const TTAMachine::Port*,
73 typedef std::set<TTAMachine::Bus*,
75 typedef std::set<const TTAMachine::FunctionUnit*,
77
78 virtual bool check(const TTAMachine::Machine& mach,
79 MachineCheckResults& results) const;
80
81 static bool isConnected(
82 const TTAMachine::Port& sourcePort,
83 const TTAMachine::Port& destinationPort,
84 const TTAMachine::Guard* guard = NULL);
85
86 static bool isConnected(
87 const TTAMachine::BaseRegisterFile& sourceRF,
88 const TTAMachine::Port& destPort);
89
90 static bool isConnected(
91 const TTAMachine::BaseRegisterFile& sourceRF,
92 const TTAMachine::BaseRegisterFile& destRF,
93 const TTAMachine::Guard* guard = NULL);
94
95 static bool isConnectedWithBothGuards(
96 const TTAMachine::BaseRegisterFile& sourceRF,
97 const TTAMachine::BaseRegisterFile& destRF,
98 std::pair<const TTAMachine::RegisterFile*,int> guardReg);
99
100 static bool isConnected(
101 const TTAMachine::Port& sourcePort,
102 const TTAMachine::RegisterFile& destRF);
103
104 static bool isConnected(
105 const TTAMachine::BaseRegisterFile& sourceRF,
106 const TTAMachine::FunctionUnit& destFU);
107
108 static bool isConnected(
109 PortSet sourcePorts,
110 PortSet destinationPorts,
111 const TTAMachine::Guard* guard = NULL);
112
113 static bool isConnected(
114 const std::set<TTAMachine::Port*> ports,
115 const TTAMachine::Bus& bus
116 );
117
118 static bool isConnected(
119 const TTAMachine::Bus& bus,
120 const TTAMachine::Port& port);
121
122 static bool isConnected(
123 const TTAMachine::Port& port,
124 const TTAMachine::Bus& bus);
125
126 static bool canWriteAllImmediates(TTAMachine::Port& destPort);
127
128 static bool canTransportImmediate(
129 const TTAProgram::TerminalImmediate& immediate,
130 const TTAMachine::BaseRegisterFile& destRF,
131 const TTAMachine::Guard* guard = NULL);
132
133 static bool canTransportImmediate(
134 const TTAProgram::TerminalImmediate& immediate,
135 const TTAMachine::Port& destinationPort,
136 const TTAMachine::Guard* guard = NULL);
137
138 static bool canTransportImmediate(
139 const TTAProgram::TerminalImmediate& immediate,
140 PortSet destinationPorts,
141 const TTAMachine::Guard* guard = NULL);
142
143 static bool canTransportImmediate(
144 const TTAProgram::TerminalImmediate& immediate,
145 const TTAMachine::Bus& bus);
146
147 static bool canTransportMove(
148 const MoveNode& moveNode,
150 bool ignoreGuard = false);
151
152 static bool canBypass(
153 const MoveNode& src,
154 const MoveNode& user,
155 const TTAMachine::Machine& targetMachine);
156
157 static bool rfConnected(
158 const TTAMachine::RegisterFile& rf);
159
160 static bool fromRfConnected(
162
163 static bool toRfConnected(
164 const TTAMachine::RegisterFile& brf);
165
166 static std::set<const TTAMachine::Bus*> connectedSourceBuses(
167 const TTAMachine::Port& port);
168
169 static std::set<const TTAMachine::Bus*> connectedDestinationBuses(
170 const TTAMachine::Port& port);
171
172 static void appendConnectedSourceBuses(
173 const TTAMachine::Port& port, std::set<const TTAMachine::Bus*>& buses);
174
176 const TTAMachine::Port& port, std::set<const TTAMachine::Bus*>& buses);
177
178 static void appendConnectedSourceBuses(
179 const TTAMachine::Unit& unit, std::set<const TTAMachine::Bus*>& buses);
180
182 const TTAMachine::Unit& unit, std::set<const TTAMachine::Bus*>& buses);
183
184 static std::set<const TTAMachine::RegisterFile*,
187
188 static int requiredImmediateWidth(
189 bool signExtension,
190 const TTAProgram::TerminalImmediate& source,
191 const TTAMachine::Machine& mach);
192
193 static bool busConnectedToPort(
194 const TTAMachine::Bus& bus, const TTAMachine::Port& port);
195
196 static bool busConnectedToRF(
197 const TTAMachine::Bus& bus, const TTAMachine::Unit& destRF);
198
199 static bool busConnectedToFU(
200 const TTAMachine::Bus& bus, const TTAMachine::FunctionUnit& fu,
201 const TCEString& opName, int opIndex);
202
203 static bool busConnectedToAnyFU(
204 const TTAMachine::Bus& bus, const MoveNode& moveNode);
205
206 static bool busConnectedToDestination(
207 const TTAMachine::Bus& bus, const MoveNode& moveNode);
208
209 static int totalConnectionCount(const TTAMachine::Machine& mach);
210
212 const TTAMachine::Machine& mach, const MoveNode& node);
213
215 const TTAMachine::Machine& mach, const MoveNode& node);
216
218 const MoveNode& src,
219 PortSet& ports,
220 bool ignoreGuard = false);
221
223 PortSet& ports,
224 const MoveNode& dest);
225
226 static PortSet findWritePorts(const TTAMachine::Unit& rf);
227 static PortSet findReadPorts(const TTAMachine::Unit& rf);
228
229 static BusSet findRoutes(
230 TTAMachine::Port& port1,
231 TTAMachine::Port& port2);
232
233 static bool canBypassOpToDst(
234 const TTAMachine::Machine& mach,
235 const TCEString& opName,
236 int outIndex,
237 const MoveNode& mn);
238
239 static FUSet copyOpFUs(
240 const TTAMachine::Machine& mach,
241 const MoveNode& mn);
242
243 static bool hasConditionalMoves(
244 const TTAMachine::Machine& mach,
245 const std::set<int>& rfWidths);
246
249
250 static void addAnnotatedFUs(
251 std::set<TCEString>& candidateFUs,
252 const TTAProgram::Move& m,
254
256 const TTAMachine::RegisterFile& rf);
257
258 static bool isEquallyConnected(
261
262 static std::pair<bool,bool> hasBothGuards(
263 const TTAMachine::Bus* bus,
264 std::pair<const TTAMachine::RegisterFile*,int> guardReg);
265
266 static std::set<const TTAMachine::RegisterFile*>
269
270 static int maxLIMMCount(const TTAMachine::Machine& targetMachine);
271 static int maxSIMMCount(const TTAMachine::Machine& targetMachine);
272
273 static bool
275 const TTAMachine::Port& port, std::set<int> widths);
276
277 static std::pair<int, int>
278 shortImmBits(std::set<const TTAMachine::Bus*>& buses);
279
280 static std::pair<int, int>
282
283 static bool
285 const TTAMachine::Machine& mach);
286
287 static std::pair<int, int>
288 immBits(const TTAMachine::Machine& mach);
289
290 static void
292 std::set<const TTAMachine::Bus*>& buses,
293 std::pair<int, int>&);
294
295static int operandWidth(const TTAMachine::HWOperation& hwop, int index);
296
297static bool raConnected(const TTAMachine::Machine& machine);
298
299protected:
300 MachineConnectivityCheck(const std::string& shortDesc_);
301private:
302 typedef std::pair<const TTAMachine::Port*,const TTAMachine::Port*>
304
305 typedef std::pair<const TTAMachine::BaseRegisterFile*,
307
308 typedef std::pair<const TTAMachine::BaseRegisterFile*,
310
311 typedef std::pair<const TTAMachine::Port*,
313
314 typedef std::map<PortPortPair,bool> PortPortBoolMap;
315 typedef std::map<RfRfPair,bool> RfRfBoolMap;
316 typedef std::map<RfPortPair,bool> RfPortBoolMap;
317 typedef std::map<PortRfPair,bool> PortRfBoolMap;
318
323};
324
325#endif
TTAMachine::Machine * machine
the architecture definition of the estimated processor
const std::string & shortDesc_
Short description of the check.
static bool busConnectedToRF(const TTAMachine::Bus &bus, const TTAMachine::Unit &destRF)
std::pair< const TTAMachine::Port *, const TTAMachine::Port * > PortPortPair
static void appendConnectedDestinationBuses(const TTAMachine::Port &port, std::set< const TTAMachine::Bus * > &buses)
static bool busConnectedToAnyFU(const TTAMachine::Bus &bus, const MoveNode &moveNode)
static bool needsRegisterCopiesDueImmediateOperands(const TTAMachine::Machine &mach)
std::map< PortRfPair, bool > PortRfBoolMap
static std::set< const TTAMachine::RegisterFile *, TTAMachine::MachinePart::Comparator > tempRegisterFiles(const TTAMachine::Machine &machine)
static void appendConnectedSourceBuses(const TTAMachine::Port &port, std::set< const TTAMachine::Bus * > &buses)
static std::pair< int, int > immBits(const TTAMachine::RegisterFile &rf)
static std::set< const TTAMachine::Bus * > connectedSourceBuses(const TTAMachine::Port &port)
static PortPortBoolMap portPortCache_
std::pair< const TTAMachine::Port *, const TTAMachine::BaseRegisterFile * > PortRfPair
static void addAnnotatedFUs(std::set< TCEString > &candidateFUs, const TTAProgram::Move &m, TTAProgram::ProgramAnnotation::Id id)
static std::set< const TTAMachine::Bus * > connectedDestinationBuses(const TTAMachine::Port &port)
static BusSet findRoutes(TTAMachine::Port &port1, TTAMachine::Port &port2)
static bool canBypass(const MoveNode &src, const MoveNode &user, const TTAMachine::Machine &targetMachine)
std::pair< const TTAMachine::BaseRegisterFile *, const TTAMachine::Port * > RfPortPair
static PortSet findWritePorts(const TTAMachine::Unit &rf)
std::map< PortPortPair, bool > PortPortBoolMap
static int canSourceWriteToAnyDestinationPort(const MoveNode &src, PortSet &ports, bool ignoreGuard=false)
static bool toRfConnected(const TTAMachine::RegisterFile &brf)
static bool busConnectedToFU(const TTAMachine::Bus &bus, const TTAMachine::FunctionUnit &fu, const TCEString &opName, int opIndex)
static bool raConnected(const TTAMachine::Machine &machine)
static bool rfConnected(const TTAMachine::RegisterFile &rf)
static bool isConnectedWithBothGuards(const TTAMachine::BaseRegisterFile &sourceRF, const TTAMachine::BaseRegisterFile &destRF, std::pair< const TTAMachine::RegisterFile *, int > guardReg)
static PortSet findReadPorts(const TTAMachine::Unit &rf)
static bool fromRfConnected(const TTAMachine::BaseRegisterFile &brf)
static bool canTransportMove(const MoveNode &moveNode, const TTAMachine::Machine &machine, bool ignoreGuard=false)
std::set< const TTAMachine::FunctionUnit *, const TTAMachine::MachinePart::Comparator > FUSet
static int requiredImmediateWidth(bool signExtension, const TTAProgram::TerminalImmediate &source, const TTAMachine::Machine &mach)
static bool isConnected(const TTAMachine::Port &sourcePort, const TTAMachine::Port &destinationPort, const TTAMachine::Guard *guard=NULL)
static int maxLIMMCount(const TTAMachine::Machine &targetMachine)
static PortSet findPossibleDestinationPorts(const TTAMachine::Machine &mach, const MoveNode &node)
static std::pair< bool, bool > hasBothGuards(const TTAMachine::Bus *bus, std::pair< const TTAMachine::RegisterFile *, int > guardReg)
virtual bool check(const TTAMachine::Machine &mach, MachineCheckResults &results) const
static bool busConnectedToDestination(const TTAMachine::Bus &bus, const MoveNode &moveNode)
static bool canBypassOpToDst(const TTAMachine::Machine &mach, const TCEString &opName, int outIndex, const MoveNode &mn)
static bool isPortApplicableToWidths(const TTAMachine::Port &port, std::set< int > widths)
static std::pair< int, int > shortImmBits(std::set< const TTAMachine::Bus * > &buses)
std::set< TTAMachine::Bus *, const TTAMachine::MachinePart::Comparator > BusSet
static bool isConnectedToDifferentlyConnectedRFs(const TTAMachine::RegisterFile &rf)
static bool canTransportImmediate(const TTAProgram::TerminalImmediate &immediate, const TTAMachine::BaseRegisterFile &destRF, const TTAMachine::Guard *guard=NULL)
static bool busConnectedToPort(const TTAMachine::Bus &bus, const TTAMachine::Port &port)
static bool canWriteAllImmediates(TTAMachine::Port &destPort)
static int operandWidth(const TTAMachine::HWOperation &hwop, int index)
static int totalConnectionCount(const TTAMachine::Machine &mach)
static PortSet findPossibleSourcePorts(const TTAMachine::Machine &mach, const MoveNode &node)
static FUSet copyOpFUs(const TTAMachine::Machine &mach, const MoveNode &mn)
std::map< RfPortPair, bool > RfPortBoolMap
std::pair< const TTAMachine::BaseRegisterFile *, const TTAMachine::BaseRegisterFile * > RfRfPair
static bool canAnyPortWriteToDestination(PortSet &ports, const MoveNode &dest)
static std::set< const TTAMachine::RegisterFile * > needRegCopiesDueReadPortConflicts(const TTAMachine::Machine &machine)
std::map< RfRfPair, bool > RfRfBoolMap
static int maxSIMMCount(const TTAMachine::Machine &targetMachine)
static bool isEquallyConnected(const TTAMachine::BaseRegisterFile &RF1, const TTAMachine::BaseRegisterFile &RF2)
std::set< const TTAMachine::Port *, const TTAMachine::MachinePart::Comparator > PortSet
static bool hasConditionalMoves(const TTAMachine::Machine &mach, const std::set< int > &rfWidths)
Id
the ID in TPEF is 24 bits, here enum