68 MachineCheck(
"Common helper functionality for connectivity checks.") {
83 const std::string& shortDesc_) :
MachineCheck(shortDesc_) {
92 for (PortSet::iterator i =
94 i != sourcePorts.end(); i++) {
96 for (PortSet::iterator j =
97 destinationPorts.begin();
98 j != destinationPorts.end(); j++) {
131 const Guard* guard) {
134 PortPortBoolMap::const_iterator
137 if (i->second ==
false || guard == NULL) {
141 std::set<const TTAMachine::Bus*> sourceBuses;
143 sourcePort, sourceBuses);
145 std::set<const TTAMachine::Bus*> destinationBuses;
147 destinationPort, destinationBuses);
149 std::set<const TTAMachine::Bus*> sharedBuses;
151 if (sharedBuses.size() > 0) {
158 for (std::set<const TTAMachine::Bus*>::iterator i = sharedBuses.begin();
159 i != sharedBuses.end(); i++) {
160 if ((*i)->hasGuard(*guard)) {
184 const Guard* guard) {
186 std::set<const TTAMachine::Bus*> buses;
189 for (
auto bus : buses) {
192 bus->signExtends(), immediate, *destRF.
machine());
193 if (bus->immediateWidth() < requiredBits) {
200 if (bus->hasGuard(*guard)) {
220 const Guard* guard) {
222 std::set<const TTAMachine::Bus*> buses;
224 destinationPort, buses);
226 for (
auto i = buses.begin(); i != buses.end(); ++i) {
247 const Guard* guard) {
249 for (PortSet::iterator i =
250 destinationPorts.begin();
251 i != destinationPorts.end(); i++) {
296 RfPortBoolMap::const_iterator
302 std::set<const TTAMachine::Bus*> srcBuses;
304 for (
int i = 0; i < sourceRF.
portCount(); i++) {
311 std::set<const TTAMachine::Bus*> sharedBuses;
313 srcBuses, destBuses, sharedBuses);
314 if (sharedBuses.size() > 0) {
339 RfRfBoolMap::const_iterator
342 if (i->second ==
false || guard == NULL) {
346 std::set<const TTAMachine::Bus*> srcBuses;
349 std::set<const TTAMachine::Bus*> dstBuses;
352 std::set<const TTAMachine::Bus*> sharedBuses;
354 if (sharedBuses.size() > 0) {
360 for (std::set<const TTAMachine::Bus*>::iterator i = sharedBuses.begin();
361 i != sharedBuses.end(); i++) {
362 if ((*i)->hasGuard(*guard)) {
388 std::set<const TTAMachine::Bus*> srcBuses;
391 std::set<const TTAMachine::Bus*> dstBuses;
394 std::set<const TTAMachine::Bus*> sharedBuses;
396 return (sharedBuses.size() > 0);
414 PortRfBoolMap::const_iterator
420 std::set<const TTAMachine::Bus*> sourceBuses =
422 std::set<const TTAMachine::Bus*> destBuses;
424 for (
int i = 0; i < destRF.
portCount(); i++) {
431 std::set<const TTAMachine::Bus*> sharedBuses;
434 if (sharedBuses.size() > 0) {
451 std::set<const TTAMachine::Bus*> dstBuses1, dstBuses2;
455 std::set<const TTAMachine::Bus*> srcBuses1, srcBuses2;
459 return dstBuses1 == dstBuses2 && srcBuses1 == srcBuses2;
465 auto fup =
dynamic_cast<const FUPort*
>(&port);
466 if (fup ==
nullptr) {
476 for (
int i = 0; i < fu->operationCount(); i++) {
478 if (!hwop->isBound(*fup))
481 int opIndex = hwop->io(*fup);
505 int width = brf.
width();
506 bool isVectorRegs = width > 32;
512 std::set<const TTAMachine::Bus*> rfBuses;
514 for (
int i = 0; i < brf.
portCount(); i++) {
521 std::set<int> widths;
522 widths.insert(brf.
width());
524 auto widthsExt = widths;
528 widthsExt.insert(16);
531 widthsExt.insert(32);
535 for (
auto fu: fuNav) {
536 for (
int j = 0; j < fu->portCount(); j++ ) {
537 Port& port = *fu->port(j);
541 std::set<const TTAMachine::Bus*> sharedBuses;
544 if (sharedBuses.size() == 0) {
558 for (
int i = 0; i < cu.
portCount(); i++ ) {
564 std::set<const TTAMachine::Bus*> sharedBuses;
567 if (sharedBuses.size() == 0) {
596 std::pair<int, int> rv;
597 std::set<const TTAMachine::Bus*> buses;
607 std::set<const TTAMachine::Bus*>& buses, std::pair<int, int>& immBits) {
609 for (
auto b: buses) {
610 int w = b->immediateWidth();
611 if (b->signExtends()) {
623 std::pair<int, int> rv(0,0);
624 std::set<const TTAMachine::Bus*> rfBuses;
626 if (mach ==
nullptr) {
630 for (
int i = 0; i < rf.
portCount(); i++) {
631 auto port = rf.
port(i);
632 if (port->inputSocket() != NULL) {
639 for (
auto iu: mach->immediateUnitNavigator()) {
641 for (
int j = 0; j < iu->portCount(); j++ ) {
642 Port& port = *iu->port(j);
646 std::set<const TTAMachine::Bus*> sharedBuses;
650 if (sharedBuses.size() != 0) {
651 if (iu->signExtends()) {
652 rv.first = std::max(rv.first, w);
654 rv.second = std::max(rv.second, w);
677 int width = rf.
width();
678 bool isVectorRF = width > 32;
685 std::set<const TTAMachine::Bus*> rfBuses;
687 std::set<int> widths;
688 widths.insert(rf.
width());
698 for (
int i = 0; i < rf.
portCount(); i++) {
706 for (
auto fu: fuNav) {
707 for (
int j = 0; j < fu->portCount(); j++ ) {
708 Port& port = *fu->port(j);
712 port.
width() >= width) {
713 std::set<const TTAMachine::Bus*> sharedBuses;
716 if (sharedBuses.size() == 0) {
730 for (
int i = 0; i < cu.
portCount(); i++ ) {
734 if (port.
width() == width) {
736 std::set<const TTAMachine::Bus*> sharedBuses;
739 if (sharedBuses.size() == 0) {
748 if (rfImmBits.first >= width || rfImmBits.second >= width) {
754 if (rfImmBits.first < allImmBits.first ||
755 (rfImmBits.second < allImmBits.second &&
756 (rfImmBits.first-1) < allImmBits.second)) {
768std::set<const TTAMachine::Bus*>
772 std::set<const TTAMachine::Bus*> buses;
783std::set<const TTAMachine::Bus*>
787 std::set<const TTAMachine::Bus*> buses;
804 if (inputS != NULL) {
823 if (outputS != NULL) {
842 for (
int p = 0; p < unit.
portCount(); ++p) {
860 for (
int p = 0; p < unit.
portCount(); ++p) {
878 for (
auto rf2: regNav) {
882 ((rf.
width() <= 32 && rf2->width() <= 32) ||
883 (rf.
width() == rf2->width()))) {
895 TCEString msg =
"ADF has unknown operation: "; msg << hwop.
name();
899 return operand.
width();
903std::set<const RegisterFile*>
907 std::map<int, int> noRegInputCount;
911 std::set<const RegisterFile*> rv;
913 for (
auto fu : fuNav) {
914 for (
int j = 0; j < fu->operationCount(); j++) {
915 auto hwop = fu->operation(j);
916 std::map<int, int> myNoRegInputCount;
917 for (
int k = 1; k <= hwop->operandCount(); k++) {
918 auto p = hwop->port(k);
919 if (p->inputSocket() != NULL &&
920 (p->noRegister() || p->isTriggering())) {
922 myNoRegInputCount[w]++;
924 myNoRegInputCount[32]++;
925 }
else if (w == 32) {
926 myNoRegInputCount[1]++;
931 for(
auto mw : myNoRegInputCount) {
933 noRegInputCount[w] = std::max(noRegInputCount[w], mw.second);
937 for (
auto rf: regNav) {
939 if (rf->maxReads() < noRegInputCount[rf->width()]) {
950 std::set<int> scalarWidths = {1,32};
952 for (
int j = 0; j < fu->portCount(); j++ ) {
953 Port& port = *fu->port(j);
968 static bool spammed =
false;
977 auto port = jumpOp->
port(1);
980 std::cout <<
"Reserving registers for temp reg use because "
981 <<
"a connection is missing between the RA port "
982 <<
"and the address port of jump operation." << std::endl;
992 bool hasLoad =
false;
993 bool hasStore =
false;
994 bool raConnectedToLoad =
false;
995 bool raConnectedToStore =
false;
997 if (!fu->hasAddressSpace() ||
998 !fu->addressSpace()->hasNumericalId(0)) {
1001 if (fu->hasOperation(ldOp)) {
1003 auto ldhwop = fu->operation(ldOp);
1004 auto port = ldhwop->port(2);
1006 raConnectedToLoad =
true;
1010 if (fu->hasOperation(stOp)) {
1012 auto sthwop = fu->operation(stOp);
1013 auto port = sthwop->port(2);
1015 raConnectedToStore =
true;
1020 if ((raConnectedToLoad || !hasLoad) &&
1021 (raConnectedToStore || !hasStore)) {
1025 std::cout <<
"Reserving registers for temp reg use because "
1026 <<
"a connection is missing between the RA port "
1027 <<
"and the LSU." << std::endl;
1040std::set<const RegisterFile*, MachinePart::Comparator>
1043 static bool spammed =
false;
1045 std::set<const RegisterFile*, TTAMachine::MachinePart::Comparator> rfs;
1052 std::set<int> portConflictWidths;
1053 for (
auto rf: reducedConnRfs) {
1054 int w = rf->width();
1055 portConflictWidths.insert(w);
1058 bool portConflicts = !reducedConnRfs.empty();
1059 bool allConnected =
true;
1060 if (portConflicts) {
1062 std::cout <<
"Reserving registers for temp reg use because " <<
1063 "of possible RF port conflicts; There are operations " <<
1064 "on registerless FUs with more operations than there are " <<
1065 "read ports on some RFs." << std::endl;
1068 allConnected =
false;
1070 int widestRFWidth = 0;
1072 std::set<int> lackingConnectivityWidths;
1073 std::set<const TTAMachine::RegisterFile*> allConnectedRFs;
1074 std::map<int, const RegisterFile*> priorityConnectedRFs;
1075 std::map<int, int> regCounts;
1076 std::map<int, int> regFileCounts;
1081 lackingConnectivityWidths.insert(32);
1082 allConnected =
false;
1084 std::cout <<
"Reserving registers for temp reg use because " <<
1085 "all immediate operands are not possible to transfer " <<
1086 "directly. This reduces the number of registers available " <<
1087 "for storing usable values." << std::endl;
1092 for (
auto rf: regNav) {
1093 int w = rf->width();
1094 if (w > widestRFWidth) {
1097 regCounts[w] += rf->size();
1101 for (
auto rf: regNav) {
1102 int width = rf->width();
1104 reducedConnRfs.insert(rf);
1105 allConnected =
false;
1106 lackingConnectivityWidths.insert(width);
1108 std::cout <<
"Reserving registers for temp reg use because RF: "
1109 << rf->name() <<
" has reduced connectivity to FUs or "
1110 <<
"immediates." << std::endl;
1114 allConnectedRFs.insert(rf);
1117 auto connectedRF = priorityConnectedRFs[width];
1121 (connectedRF ==
nullptr ||
1122 rf->maxReads() * rf->maxWrites() >
1123 connectedRF->maxReads() * connectedRF->maxWrites())) {
1124 priorityConnectedRFs[width] = rf;
1130 allConnected =
false;
1131 lackingConnectivityWidths.insert(32);
1138 bool needNextBigger =
false;
1140 if (priorityConnectedRFs[1] !=
nullptr &&
1142 regFileCounts[1] > 1) {
1143 rfs.insert(priorityConnectedRFs[1]);
1145 needNextBigger =
true;
1149 if (needNextBigger ||
1152 if (!portConflicts && priorityConnectedRFs[32] !=
nullptr) {
1153 rfs.insert(priorityConnectedRFs[32]);
1155 for (
auto rf: regNav) {
1156 if (rf->width() == 32 &&
1166 for (
int w = 64; w <= widestRFWidth; w*=2) {
1169 if (!portConflicts && priorityConnectedRFs[w] !=
nullptr) {
1170 rfs.insert(priorityConnectedRFs[w]);
1172 for (
auto rf: regNav) {
1173 if (rf->width() == w &&
1196 int portWidth = destPort.
width();
1206 if (bus->signExtends()) {
1207 sextImm = std::max(immw, sextImm);
1209 zextImm = std::max(immw, zextImm);
1211 if (immw >= portWidth) {
1221 for (
int i = 0; i < iuNav.
count(); i++) {
1223 int immw = iu.
width();
1226 sextImm = std::max(immw, sextImm);
1228 zextImm = std::max(immw, zextImm);
1233 auto widestImms =
immBits(mach);
1235 if (widestImms.first > sextImm ||
1236 (widestImms.second > zextImm && (sextImm-1) < widestImms.second)) {
1262 assert(
false &&
"No default data address space");
1265 return signExtension ?
1269 return signExtension ?
1276 return signExtension ?
1282 if (signExtension) {
1285 }
else if (!signExtension) {
1296 if (inputS != NULL) {
1311 for (
int i = 0; i < destRF.
portCount(); i++) {
1334 "Target is missing operand bindings for: "
1397 std::set<TCEString> candidateFUs;
1398 std::set<TCEString> allowedFUs;
1409 candidateFUs,gcu->
name())) {
1418 for (
int i = 0; i < fuNav.
count(); i++) {
1421 candidateFUs,fu.
name())) {
1425 allowedFUs,fu.
name())) {
1467 for (
int bi = 0; bi < mach.
busNavigator().count(); ++bi) {
1490 std::set<TCEString> allowedFUNames;
1496 allowedFUNames.insert(
1505 allowedFUNames.insert(
1516 allowedFUNames.insert(u->
name());
1523 std::set<TCEString> candidateFUs;
1524 std::set<TCEString> allowedFUs;
1527 candidateFUs, node.
move(),
1530 allowedFUs, node.
move(),
1533 if (!candidateFUs.empty()) {
1534 if (allowedFUNames.empty()) {
1535 allowedFUNames = candidateFUs;
1537 std::set<TCEString> tmp;
1539 allowedFUNames = tmp;
1544 if (!allowedFUs.empty()) {
1545 if (allowedFUNames.empty()) {
1546 allowedFUNames = allowedFUs;
1548 std::set<TCEString> tmp;
1550 allowedFUNames = tmp;
1554 for (
int i = 0; i <= nav.
count(); i++) {
1556 if (i == nav.
count()) {
1563 allowedFUNames, fu->
name())) {
1583 std::cerr <<
"node should have dest as reg: " <<
1594 for (
int i = 0; i < rf.
portCount(); i++) {
1606 for (
int i = 0; i < rf.
portCount(); i++) {
1622 std::vector<const Socket*> sockets{
1625 for (
const Socket* socket : sockets) {
1626 if (socket !=
nullptr && socket->isConnectedTo(bus)) {
1648 const std::set<TTAMachine::Port*> ports,
const TTAMachine::Bus& bus) {
1649 for (
const auto& port : ports) {
1689 std::set<TCEString> candidateFUs;
1690 std::set<TCEString> allowedFUs;
1697 for (
int i = 0; i < nav.
count(); i++) {
1700 allowedFUs, fu->
name())) {
1704 candidateFUs, fu->
name())) {
1730 for (
int i = 0; i < nav.
count(); i++) {
1735 for (
int i = 0; i < iu->
portCount(); i++) {
1761 if (destinationPorts.empty()) {
1770 *imm, destinationPorts)) {
1778 *(*destinationPorts.begin())->parentUnit()->machine(), src);
1783 sourcePorts, destinationPorts,
1798 targetMachine, user);
1801 if (destinationPorts.empty()) {
1810 *imm, destinationPorts)) {
1823 sourcePorts, destinationPorts,
1836 if (sourcePorts.empty()) {
1841 *(*sourcePorts.begin())->parentUnit()->machine(), dest);
1855 moveNode, destinationPorts, ignoreGuard);
1860 std::set<TCEString>& candidateFUs,
1865 for (
int i = 0; i < annotationCount; ++i) {
1867 candidateFUs.insert(candidateFU);
1885 std::set<std::pair<const RegisterFile*,int> > allGuardRegs;
1889 for (
int bi = 0; bi < busNav.
count(); ++bi) {
1891 for (
int gi = 0; gi < bus->
guardCount(); gi++) {
1896 allGuardRegs.insert(
1903 if (allGuardRegs.empty()) {
1908 for (
int i = 0; i < regNav.
count(); i++) {
1910 for (
int j = 0; j < regNav.
count(); j++) {
1912 int width = drf->
width();
1915 if (!rfWidths.empty() &&
1920 for (std::set<std::pair<const RegisterFile*,int> >::iterator k =
1921 allGuardRegs.begin(); k != allGuardRegs.end(); k++) {
1952 std::pair<const RegisterFile*,int> guardReg) {
1954 RfRfBoolMap::const_iterator
1957 if (i->second ==
false) {
1961 std::set<const TTAMachine::Bus*> srcBuses;
1964 std::set<const TTAMachine::Bus*> dstBuses;
1967 std::set<const TTAMachine::Bus*> sharedBuses;
1970 bool trueOK =
false;
1971 bool falseOK =
false;
1972 if (sharedBuses.size() > 0) {
1974 for (
auto bus: sharedBuses) {
1975 std::pair<bool, bool> guardsOK =
hasBothGuards(bus, guardReg);
1976 trueOK |= guardsOK.first;
1977 falseOK |= guardsOK.second;
1978 if (trueOK && falseOK) {
1987 const TTAMachine::Bus* bus, std::pair<const RegisterFile*,int> guardReg) {
1988 bool trueOK =
false;
1989 bool falseOK =
false;
1991 for (
int gi = 0; gi < bus->
guardCount(); gi++) {
2003 if (falseOK && trueOK) {
2004 return std::pair<bool, bool>(
true,
true);
2009 return std::pair<bool, bool>(trueOK, falseOK);
2016 for (
auto iu : iuNav) {
2017 limmCount += iu->maxReads();
2027 for (
auto bus : busNav) {
2028 if (bus->immediateWidth() > 0) {
2050 FUSet partiallySuitableFUs;
2052 std::string opName =
"COPY";
2059 if (fu->hasOperation(opName)) {
2061 copyOutPorts.insert(hwop->
port(2));
2062 copyTriggerPorts.insert(hwop->
port(1));
2064 copyOutPorts, destinationPorts,
2067 partiallySuitableFUs.insert(fu);
2069 mn, copyTriggerPorts)) {
2070 suitableFUs.insert(fu);
2075 return suitableFUs.empty() ? partiallySuitableFUs : suitableFUs;
2088 for (
auto fu: fuNav) {
2089 if (fu->hasOperation(opName)) {
2091 sourcePorts.insert(hwop->
port(outIndex));
2100 sourcePorts, destinationPorts,
#define assert(condition)
TTAMachine::Machine * machine
the architecture definition of the estimated processor
static int verboseLevel()
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
virtual ~MachineConnectivityCheck()
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 RfPortBoolMap rfPortCache_
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
static RfRfBoolMap rfRfCache_
std::pair< const TTAMachine::BaseRegisterFile *, const TTAMachine::BaseRegisterFile * > RfRfPair
MachineConnectivityCheck()
static PortRfBoolMap portRfCache_
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)
static TTAMachine::AddressSpace * defaultDataAddressSpace(const TTAMachine::Machine &mach)
bool isGuardOperation() const
bool isSourceVariable() const
ProgramOperation & sourceOperation() const
bool isDestinationOperation() const
std::string toString() const
ProgramOperation & guardOperation() const
TTAProgram::Move & move()
bool isSourceOperation() const
bool isSourceConstant() const
ProgramOperation & destinationOperation(unsigned int index=0) const
static NullOperation & instance()
virtual int width() const
Operation & operation(const char *name)
virtual TCEString name() const
virtual Operand & operand(int id) const
int outputMoveCount() const
const Operation & operation() const
const TTAMachine::FunctionUnit * scheduledFU() const
int inputMoveCount() const
MoveNode & inputMove(int index) const
MoveNode & outputMove(int index) const
ULongWord uLongWordValue() const
SLongWord sLongWordValue() const
virtual ULongWord end() const
FunctionUnit * parentUnit() const
virtual int width() const
virtual RFPort * port(const std::string &name) const
int immediateWidth() const
bool hasGuard(const Guard &guard) const
Guard * guard(int index) const
virtual Machine * machine() const
virtual TCEString name() const
SpecialRegisterPort * returnAddressPort() const
virtual AddressSpace * addressSpace() const
virtual HWOperation * operation(const std::string &name) const
virtual bool hasOperationLowercase(const std::string &name) const
virtual HWOperation * operationLowercase(const std::string &name) const
virtual bool hasOperation(const std::string &name) const
virtual BaseFUPort * port(const std::string &name) const
virtual bool isInverted() const
virtual FUPort * port(int operand) const
const std::string & name() const
ComponentType * item(int index) const
virtual RegisterFileNavigator registerFileNavigator() const
virtual FunctionUnitNavigator functionUnitNavigator() const
bool isLittleEndian() const
virtual ImmediateUnitNavigator immediateUnitNavigator() const
virtual BusNavigator busNavigator() const
virtual ControlUnit * controlUnit() const
virtual Socket * outputSocket() const
virtual bool isInput() const
virtual bool isOutput() const
virtual int width() const =0
Unit * parentUnit() const
virtual Socket * inputSocket() const
int registerIndex() const
const RegisterFile * registerFile() const
int connectionCount() const
Segment * segment(int index) const
virtual int portCount() const
virtual Port * port(const std::string &name) const
int annotationCount(ProgramAnnotation::Id id=ProgramAnnotation::ANN_UNDEF_ID) const
ProgramAnnotation annotation(int index, ProgramAnnotation::Id id=ProgramAnnotation::ANN_UNDEF_ID) const
const TTAMachine::Guard & guard() const
MoveGuard & guard() const
bool isUnconditional() const
Terminal & source() const
Terminal & destination() const
Id
the ID in TPEF is 24 bits, here enum
@ ANN_ALLOWED_UNIT_DST
Dst. unit candidate.
@ ANN_CONN_CANDIDATE_UNIT_DST
Dst. unit candidate.
@ ANN_CONN_CANDIDATE_UNIT_SRC
Src. unit candidate.
@ ANN_ALLOWED_UNIT_SRC
Candidate units can be passed for resource manager for choosing the source/destination unit of the mo...
std::string stringValue() const
virtual int operationIndex() const
virtual bool isRA() const
virtual Operation & hintOperation() const
virtual bool isBasicBlockReference() const
virtual bool isCodeSymbolReference() const
virtual bool isGPR() const
virtual int operationIndex() const
virtual bool isInstructionAddress() const
virtual const TTAMachine::Port & port() const
virtual bool isFUPort() const