127 for (
int i = 0; i < socketNav.
count(); i++) {
131 if (suitable != NULL) {
155 for (
int i = 0; i < isNav.
count(); i++) {
157 int width = slot->
width();
165 for (
int i = 0; i < busNav.
count(); i++) {
177 if (itNav.
count() > 1) {
182 unsigned amountOfRCustomOps = 0;
183 unsigned amountOfR3RCustomOps = 0;
189 for (
int i = 0; i < fNav.
count(); i++) {
191 addRiscvFormat(fTemp, bem, amountOfRCustomOps, amountOfR3RCustomOps);
205 unsigned& amountOfRCustomOps,
unsigned& amountOfR3RCustomOps)
const {
206 std::string name = format->
name();
208 const unsigned OPC_CUSTOM_0 = 0b0001011;
209 const unsigned OPC_CUSTOM_1 = 0b0101011;
222 std::string(
"opcode"), *instrFormat);
233 unsigned int customEncoding = OPC_CUSTOM_0;
234 customEncoding += (amountOfRCustomOps << 7);
235 amountOfRCustomOps++;
237 assert(amountOfRCustomOps < 1024);
254 std::string(
"opcode"), *instrFormat);
278 std::string(
"opcode"), *instrFormat);
303 std::string(
"opcode"), *instrFormat);
319 std::string(
"opcode"), *instrFormat);
337 std::string(
"opcode"), *instrFormat);
363 std::string(
"opcode"), *instrFormat);
370 unsigned int customEncoding = OPC_CUSTOM_0;
371 customEncoding += (amountOfRCustomOps << 7);
372 amountOfRCustomOps++;
374 assert(amountOfRCustomOps < 1024);
383 std::string(
"opcode"), *instrFormat);
390 unsigned int customEncoding = OPC_CUSTOM_0;
393 customEncoding += (amountOfRCustomOps << 7);
394 amountOfRCustomOps++;
397 assert(amountOfRCustomOps < 1024);
414 std::string(
"opcode"), *instrFormat);
425 unsigned int customEncoding = OPC_CUSTOM_1;
426 customEncoding += (amountOfR3RCustomOps << 7);
427 amountOfR3RCustomOps++;
428 assert(amountOfR3RCustomOps < 32);
451 for (
int i = 0; i < itNav.
count(); i++) {
453 int thisRequires = 0;
456 for (
int i = 0; i < iuNav.
count(); i++) {
464 if (thisRequires > fieldCount) {
465 fieldCount = thisRequires;
472 std::vector<int> fieldWidths(fieldCount, 0);
474 for (
int i = 0; i < itNav.
count(); i++) {
478 std::set<ImmediateUnit*> dstUnits;
479 for (
int i = 0; i < iuNav.
count(); i++) {
488 std::multiset<int> requiredSizes;
489 for (set<ImmediateUnit*>::const_iterator iter = dstUnits.begin();
490 iter != dstUnits.end(); iter++) {
493 requiredSizes.insert(
500 for (multiset<int>::const_reverse_iterator iter =
501 requiredSizes.rbegin();
502 iter != requiredSizes.rend(); iter++) {
503 if (fieldWidths[counter] < *iter) {
504 fieldWidths[counter] = *iter;
511 typedef std::pair<InstructionTemplate*, ImmediateUnit*> ImmDstMapping;
512 std::set<ImmDstMapping> mappedDestinations;
513 for (
int i = fieldCount-1; i >= 0; i--) {
514 unsigned int fieldWidth = fieldWidths[i];
517 for (
int i = 0; i < itNav.
count(); i++) {
519 for (
int i = 0; i < iuNav.
count(); i++) {
523 static_cast<unsigned int>(
528 ImmDstMapping(iTemp, iu))) {
530 mappedDestinations.insert(ImmDstMapping(iTemp, iu));
546 string busName = slot.
name();
549 Bus* bus = busNav.
item(busName);
568 if (longImmWidth > slot.
width()) {
570 if (gField == NULL) {
590 for (
int i = 0; i < itNav.
count(); i++) {
608 Bus* bus = busNav.
item(busName);
609 bool createNopField =
true;
613 createNopField =
false;
618 if (dstSockets == 0) {
625 if (createNopField) {
626 socketCodeWidths.insert(0);
628 multiset<Encoding> encodings;
631 set<Socket*> handledSockets;
632 multiset<int>::reverse_iterator scIter = socketCodeWidths.rbegin();
633 bool nopEncodingSet =
false;
634 for (multiset<Encoding>::const_iterator encIter = encodings.begin();
635 encIter != encodings.end(); encIter++) {
637 int scWidth = *scIter;
638 if (scWidth == 0 && !nopEncodingSet && createNopField) {
641 nopEncodingSet =
true;
644 for (
int i = 0; i < dstSockets; i++) {
648 if (scTable == NULL && scWidth == 0 &&
652 handledSockets.insert(&
socket);
654 }
else if (scTable != NULL && scWidth == scTable->
width() &&
656 handledSockets, &
socket)) {
660 handledSockets.insert(&
socket);
681 Bus* bus = busNav.
item(busName);
682 bool createNopField =
true;
686 createNopField =
false;
696 for (
int i = 0; i < srcBridges; i++) {
697 socketCodeWidths.insert(0);
699 if (shortImmSupport) {
703 if (createNopField) {
704 socketCodeWidths.insert(0);
707 multiset<Encoding> encodings;
711 set<Socket*> handledSockets;
713 bool nopEncodingSet =
false;
714 bool immEncodingSet = !shortImmSupport;
715 multiset<int>::reverse_iterator scIter = socketCodeWidths.rbegin();
716 for (multiset<Encoding>::const_iterator encIter = encodings.begin();
717 encIter != encodings.end(); encIter++) {
719 int scWidth = *scIter;
720 if (scWidth == 0 && !nopEncodingSet && createNopField) {
722 nopEncodingSet =
true;
726 immEncodingSet =
true;
728 bool socketFound =
false;
730 for (
int i = 0; i < srcSockets; i++) {
734 if (scTable == NULL && scWidth == 0 &&
738 handledSockets.insert(&
socket);
741 }
else if (scTable != NULL && scWidth == scTable->
width() &&
743 handledSockets, &
socket)) {
747 handledSockets.insert(&
socket);
754 assert(nextBridge < srcBridges);
758 bridge.
name(), enc.first, enc.second, field);
778 Bus* bus = busNav.
item(busName);
782 for (
int i = 0; i < guards; i++) {
788 if (portGuard != NULL) {
793 }
else if (regGuard != NULL) {
797 }
else if (ucGuard != NULL) {
834 for (SCTableMap::const_iterator iter =
scTableMap_.begin();
836 const Socket* toCheck = (*iter).first;
838 return (*iter).second;
872 typedef std::set<Socket*> SocketSet;
885 return sockets.size();
904 typedef std::vector<Socket*> SocketTable;
907 SocketTable connectedSockets;
915 connectedSockets,
socket)) {
916 connectedSockets.push_back(
socket);
922 assert(connectedSockets.size() >
static_cast<size_t>(index));
923 return *connectedSockets[index];
949 }
else if (rfPort != NULL &&
971 const Socket& socket)
const {
974 multiset<int> indexWidths;
982 if (fuParent != NULL) {
983 int encodingsNeeded(0);
984 if (
dynamic_cast<BaseFUPort*
>(port)->isOpcodeSetting() &&
990 for (
int i = 0; i < encodingsNeeded; i++) {
991 indexWidths.insert(0);
996 indexWidths.insert(indexWidth);
1001 multiset<Encoding> encodings;
1005 if (encodings.size() == 0) {
1010 assert(iu != NULL || rf != NULL);
1018 set<Port*> handledPorts;
1019 multiset<int>::const_reverse_iterator indexWidthIter =
1020 indexWidths.rbegin();
1021 for (multiset<Encoding>::const_iterator encIter = encodings.begin();
1022 encIter != encodings.end();) {
1023 int indexWidth = *indexWidthIter;
1038 if (iuParent != NULL) {
1040 if (reqIndexWidth == indexWidth) {
1042 iuParent->
name(), enc.first, enc.second,
1043 reqIndexWidth, table);
1046 handledPorts.insert(port);
1049 }
else if (rfParent != NULL) {
1051 if (reqIndexWidth == indexWidth) {
1053 rfParent->
name(), enc.first, enc.second,
1054 reqIndexWidth, table);
1057 handledPorts.insert(port);
1061 if (indexWidth != 0) {
1064 assert(fuParent != NULL);
1069 map<string,int> opcodeSet;
1070 assert(*indexWidthIter == 0);
1073 for (
int opIndex = 0;
1082 for (map<string,int>::iterator
1083 iter = opcodeSet.begin();
1084 iter != opcodeSet.end(); iter++) {
1091 operation->
name(), enc.first, enc.second,
1098 fuParent->
name(), fuPort->
name(), enc.first,
1103 handledPorts.insert(port);
1125 std::multiset<int> socketCodeWidths;
1130 if (scTable == NULL) {
1131 socketCodeWidths.insert(0);
1133 socketCodeWidths.insert(scTable->
width());
1137 return socketCodeWidths;
1153 std::set<Port*> socket1Ports;
1154 std::set<Port*> socket2Ports;
1156 for (
int i = 0; i < socket1.
portCount(); i++) {
1157 socket1Ports.insert(socket1.
port(i));
1160 for (
int i = 0; i < socket2.
portCount(); i++) {
1161 socket2Ports.insert(socket2.
port(i));
1164 if (socket1Ports == socket2Ports) {
1187 for (
int i = 0; i < bridgeNav.
count(); i++) {
1214 for (
int i = 0; i < bridgeNav.
count(); i++) {
1217 if (count == index) {
1227 return *bridgeNav.
item(0);
1280 const std::multiset<int>& oppositeFieldWidths,
1282 std::multiset<Encoding>& encodings) {
1284 if (oppositeFieldWidths.size() < 1) {
1290 unsigned int remainder = 0;
1291 unsigned int encodingsLeft = oppositeFieldWidths.size();
1292 unsigned int prevEncoding = 0;
1293 unsigned int nextEncoding = 0;
1294 unsigned int prevOppositeFieldWidth = 0;
1296 for (multiset<int>::reverse_iterator iter = oppositeFieldWidths.rbegin();
1297 iter != oppositeFieldWidths.rend(); iter++) {
1298 unsigned int oppositeFieldWidth = *iter;
1299 if (iter == oppositeFieldWidths.rbegin()) {
1301 encodings.insert(
Encoding(nextEncoding, 0));
1304 nextEncoding = prevEncoding + 1;
1308 unsigned int setEncodingCount =
1309 oppositeFieldWidths.size() - encodingsLeft;
1310 remainder = (remainder << 1) + setEncodingCount;
1313 if (oppositeFieldWidth == prevOppositeFieldWidth) {
1314 encodings.insert(
Encoding(nextEncoding, 0));
1316 assert(oppositeFieldWidth < prevOppositeFieldWidth);
1317 unsigned int freeBits =
1318 prevOppositeFieldWidth - oppositeFieldWidth;
1321 unsigned int expansion = 0;
1322 while (remainder << expansion < encodingsLeft) {
1323 if (expansion < freeBits) {
1329 nextEncoding = nextEncoding << expansion;
1330 encodings.insert(
Encoding(nextEncoding, 0));
1331 remainder = remainder << expansion;
1334 prevOppositeFieldWidth = oppositeFieldWidth;
1337 prevEncoding = nextEncoding;
1340 assert(encodings.size() == oppositeFieldWidths.size());
1352 std::multiset<Encoding>& encodings,
1355 multiset<Encoding> newSet;
1356 for (multiset<Encoding>::iterator iter = encodings.begin();
1357 iter != encodings.end(); iter++) {
1358 unsigned int encoding = iter->first;
1359 unsigned int extraBits = iter->second;
1360 extraBits += bitCount;
1361 newSet.insert(
Encoding(encoding, extraBits));
1365 encodings.insert(newSet.begin(), newSet.end());
1382 for (
int i = 0; i < itNav.
count(); i++) {
1384 for (
int i = 0; i < iTemp->
slotCount(); ++i) {
1386 maxWidth < iTemp->slot(i)->width()) {
#define assert(condition)
TTAMachine::Machine * machine
the architecture definition of the estimated processor
BinaryEncoding * generate()
const TTAMachine::Machine * machine_
The machine for which the BEM is generated.
void addSubfields(MoveSlot &slot) const
void addRiscvFormat(TTAMachine::OperationTriggeredFormat *format, BinaryEncoding &bem, unsigned &amountOfRCustomOps, unsigned &amountOfR3RCustomOps) const
static bool needsSocketCodeTable(const TTAMachine::Socket &socket)
static int socketCount(const TTAMachine::Bus &bus, TTAMachine::Socket::Direction direction)
std::multiset< int > socketCodeWidthsForBus(const TTAMachine::Bus &bus, TTAMachine::Socket::Direction socketDir) const
static void addExtraBits(std::multiset< Encoding > &encodings, int bitCount)
static TTAMachine::Socket & socket(int index, const TTAMachine::Bus &bus, TTAMachine::Socket::Direction direction)
void addPortCodes(SocketCodeTable &table, const TTAMachine::Socket &socket) const
BEMGenerator(const TTAMachine::Machine &machine)
SCTableMap scTableMap_
A map which tells which socket code table belongs to a socket.
static int requiredIndexWidth(const TTAMachine::BaseRegisterFile ®File)
static bool haveEqualConnections(const TTAMachine::Socket &socket1, const TTAMachine::Socket &socket2)
static void calculateEncodings(const std::multiset< int > &oppositeFieldWidths, bool leftAlignment, std::multiset< Encoding > &encodings)
void addSocketCodeTables(BinaryEncoding &bem)
void addEncodings(ImmediateControlField &field) const
void addTopLevelFields(BinaryEncoding &bem) const
static int sourceBridgeCount(const TTAMachine::Bus &bus)
static TTAMachine::Bridge & sourceBridge(int index, const TTAMachine::Bus &bus)
std::pair< unsigned int, unsigned int > Encoding
Typedef for encoding (first = encoding, second = extra bits).
SocketCodeTable * socketCodeTable(const TTAMachine::Socket &socket) const
SocketCodeTable * suitableSocketCodeTable(const TTAMachine::Socket &socket) const
static bool hasUnconditionalGuard(const TTAMachine::Bus &bus)
void assignSocketCodeTable(const TTAMachine::Socket *socket, SocketCodeTable *table)
unsigned int maxLongImmSlotWidth(const MoveSlot &slot) const
void addLongImmDstRegisterFields(BinaryEncoding &bem) const
int moveSlotCount() const
MoveSlot & moveSlot(int index) const
MoveSlot * parent() const
void setExtraBits(int bits)
void addDestination(const std::string &instructionTemplate, const std::string &immediateUnit)
virtual int width() const
MoveSlot * parent() const
void setSocketCodes(SocketCodeTable &codeTable)
FunctionUnit * parentUnit() const
virtual bool isOpcodeSetting() const =0
virtual int numberOfRegisters() const
Bus * destinationBus() const
virtual Segment * segment(int index) const
int immediateWidth() const
Guard * guard(int index) const
virtual int segmentCount() const
virtual Machine * machine() const
virtual TCEString name() const
virtual bool isOpcodeSetting() const
virtual HWOperation * operation(const std::string &name) const
virtual int operationCount() const
virtual bool isInverted() const
const std::string & name() const
virtual int slotCount() const
virtual bool isOneOfDestinations(const ImmediateUnit &dstUnit) const
virtual TemplateSlot * slot(int index) const
ComponentType * item(int index) const
bool hasItem(const std::string &name) const
virtual ImmediateSlotNavigator immediateSlotNavigator() const
virtual BridgeNavigator bridgeNavigator() const
virtual InstructionTemplateNavigator instructionTemplateNavigator() const
virtual SocketNavigator socketNavigator() const
virtual ImmediateUnitNavigator immediateUnitNavigator() const
virtual BusNavigator busNavigator() const
virtual OperationTriggeredFormatNavigator operationTriggeredFormatNavigator() const
Unit * parentUnit() const
virtual std::string name() const
BaseRegisterFile * parentUnit() const
int registerIndex() const
const RegisterFile * registerFile() const
const Connection & connection(const Socket &socket) const
int connectionCount() const
@ OUTPUT
Data goes from port to bus.
@ INPUT
Data goes from bus to port.
Direction direction() const
Port * port(int index) const
const std::string RISCV_S_TYPE_NAME
const std::string RISCV_R1R_TYPE_NAME
const std::string RISCV_R3R_TYPE_NAME
const std::map< std::string, int > RISCVSTypeOperations
const std::string RISCV_B_TYPE_NAME
const std::map< std::string, int > RISCVJTypeOperations
const std::map< std::string, int > RISCVITypeOperations
const std::string RISCV_J_TYPE_NAME
const std::map< std::string, int > RISCVUTypeOperations
const std::string RISCV_R_TYPE_NAME
const std::string RISCV_R1_TYPE_NAME
const std::string RISCV_I_TYPE_NAME
const std::string RISCV_U_TYPE_NAME
const std::map< std::string, int > RISCVRTypeOperations
const std::map< std::string, int > RISCVBTypeOperations