Arranges architecture FUs into a Blocks-like interconnection. This is typically as baseline for running the BusMergeMinimizer and RFPortMergeMinimizer plugins. Reference: Blocks, a reconfigurable architecture combining energy efficiency and flexibility. Wijtvliet, M. (2020). Technische Universiteit Eindhoven.
88 {
89 std::vector<RowID> result;
90
95
96
97 try {
101 std::ostringstream msg(std::ostringstream::out);
103 << "Error loading the adf." << std::endl;
104 return result;
105 }
107
108
111 for (
int i = 0; i < socketNavi.
count(); i++) {
112 if (socketNavi.
item(i)->portCount() == 0) {
114 i--;
115 }
116 }
117
118
119
120
121
122 for (
int i = 0; i < socketNavi.
count(); i++) {
124
126 assert(width == 32 &&
"ADF has Socket != 32-bit");
127 }
128
129
130 std::vector<Socket::Direction> directions;
131 std::vector<int> readSockets, writeSockets;
132 int gcu_ra_input = -1, gcu_ra_output = -1, gcu_pc = -1;
133
134 for (
int i = 0; i < socketNavi.
count(); i++) {
137 directions.push_back(dir);
138
139
142 port_count > 0 && port_count <= 2 &&
143 "Socket is not connected or connected to more than 2 FUs");
144
148 if (gcu != NULL && sock->
port(0)->
name() ==
"ra") {
149 gcu_ra_input = i;
150 } else {
151 readSockets.push_back(i);
152 }
153 } else {
154 writeSockets.push_back(i);
155 if (gcu != NULL && sock->
port(0)->
name() ==
"ra") {
156 gcu_ra_output = i;
157 }
158 }
159 }
160
161
163 for (
int i = 0; i < busNavi.
count(); i++) {
165 i--;
166 }
167
168
169
170 int busCount = 0;
171 std::vector<int> readBuses, writeBuses;
172
173
174 std::srand(time(NULL));
175 for (unsigned int i = 0; i < readSockets.size(); i++) {
176 int rd_soc_idx = readSockets[i];
177 Socket* input_sock = socketNavi.
item(rd_soc_idx);
178
179
183
185 if (
dynamic_cast<ControlUnit*
>(parentUnit) != NULL &&
186 input_sock->
port(0)->
name() ==
"pc") {
187 assert(gcu_ra_input != -1);
188 Socket* ra_sock = socketNavi.
item(gcu_ra_input);
191 gcu_pc = rd_soc_idx;
192 }
193 readBuses.push_back(busCount++);
194
195
196 int output_socket_count = writeSockets.size();
197 int req_connections = std::min(output_socket_count, 4);
198 while (req_connections > 0) {
199
200 int wr_soc_idx =
201 writeSockets[std::rand() % writeSockets.size()];
202 Socket* output_sock = socketNavi.
item(wr_soc_idx);
203
204
206 continue;
207 }
208
209
212 req_connections--;
213 }
214 }
215
216
219
223 }
224
226
231
233
234
235
236
237 assert(gcu_ra_input != -1);
239 assert(gcu_ra_output != -1);
243 }
244
245
247
248
250 result.push_back(confID);
251 return result;
252 }
#define assert(condition)
int RowID
Type definition of row ID in relational databases.
static std::ostream & errorStream()
TTAMachine::Segment * createBus(TTAMachine::Machine *mach, int width)
RowID addArchitecture(const TTAMachine::Machine &mom)
TTAMachine::Machine * architecture(RowID id) const
MachineConfiguration configuration(RowID id) const
RowID addConfiguration(const MachineConfiguration &conf)
virtual DSDBManager & db()
virtual TCEString name() const
virtual void addSlot(const std::string &slotName, int width, ImmediateUnit &dstUnit)
ComponentType * item(int index) const
virtual InstructionTemplateNavigator instructionTemplateNavigator() const
virtual void deleteInstructionTemplate(InstructionTemplate &instrTempl)
virtual SocketNavigator socketNavigator() const
virtual void removeBus(Bus &bus)
virtual ImmediateUnitNavigator immediateUnitNavigator() const
virtual void removeSocket(Socket &socket)
virtual int width() const =0
Unit * parentUnit() const
virtual std::string name() const
bool isConnectedTo(const Socket &socket) const
void attachSocket(Socket &socket)
void setDirection(Direction direction)
@ INPUT
Data goes from bus to port.
Direction direction() const
Port * port(int index) const