69 const llvm::MachineInstr* instr) :
70 operation_(&operation), poId_(idCounter++), mInstr_(instr) {
100 if (&
outputMove(i).guardOperation() ==
this) {
228 __FILE__,__LINE__,
__func__,
"MoveNode not part of PO");
280 return hwop->
io(*fup);
304 __FILE__,__LINE__,
__func__,
"MoveNode not part of PO");
322 for (
int i = begin; i <= end; i++) {
353 std::map<int,MoveNodeSet*>::iterator moveIt =
inputMoves_.begin();
355 if ((*moveIt).second->count() > 1) {
362 if ((*moveIt).second->count() > 1) {
488 std::map<int,MoveNodeSet*>::iterator moveIt =
inputMoves_.begin();
490 if ((*moveIt).second->at(0).move().destination().isOpcodeSetting()) {
491 if ((*moveIt).second->count() > 1) {
492 std::string msg =
"ProgramOperation has more then one opcode\
496 return (*moveIt).second->at(0);
500 std::string msg =
"ProgramOperation is missing opcode setting node.";
515 std::string msg =
"InputNode index out of range.";
519 std::map<int, MoveNodeSet*>::const_iterator i =
inputMoves_.find(index);
523 std::string msg =
"InputNode index not found.";
536 if (index <= operation_->numberOfInputs() ||
539 std::string msg =
"OutputNode index out of range.";
548 std::string msg =
"OutputNode index not found.";
685 for (
int i = 0; i < portC; i++) {
686 auto p = fu->
port(i);
691 ioIndex = hwop->
io(*port);
696 auto mng = *ngi->second;
719 "No MoveNode for the Move found in the ProgramOperation.");
748 output <<
" Inputs: ";
752 output <<
" Outputs: ";
787 return po1.get()->poId() < po2.get()->poId();
815 hwOperation(), idx2));
821 hwOperation(), idx1));
849 outputNode.move().source().port().parentUnit());
853 outputNode.guardOperationPtr().get() ==
this) {
872 inputNode.move().destination().port().parentUnit());
899 return outputNode.move().source().functionUnit().operation(
#define assert(condition)
std::shared_ptr< ProgramOperation > ProgramOperationPtr
static std::string toString(const T &source)
void addMoveNode(MoveNode &)
void removeMoveNode(MoveNode &)
void unsetSourceOperation()
void removeDestinationOperation(const ProgramOperation *po)
ProgramOperation & sourceOperation() const
void unsetGuardOperation()
TTAProgram::Move & move()
bool isSourceOperation() const
bool isSourceConstant() const
static NullOperation & instance()
virtual TCEString name() const
virtual int numberOfInputs() const
virtual int numberOfOutputs() const
bool operator()(const ProgramOperation *po1, const ProgramOperation *po2) const
const TTAMachine::HWOperation * hwopFromOutMove(const MoveNode &outputNode) const
std::map< int, MoveNodeSet * > inputMoves_
void addGuardOutputNode(MoveNode &node)
bool hasOutputNode(int out) const
int outputMoveCount() const
const Operation & operation() const
int outputIndexFromGuard(const TTAMachine::PortGuard &pg) const
void addOutputNode(MoveNode &node, int outputIndex)
MoveNode * findTriggerFromUnit(const TTAMachine::Unit &unit) const
bool isAnyInputAssigned()
unsigned int poId() const
const TTAMachine::FunctionUnit * scheduledFU() const
int outputIndexFromGuardOfMove(const MoveNode &node) const
int inputMoveCount() const
MoveVector allOutputMoves_
MoveNode & moveNode(const TTAProgram::Move &move) const
MoveNode * triggeringMove() const
bool areOutputsAssigned()
bool hasInputNode(int in) const
MoveNode & opcodeSettingNode()
MoveVector allInputMoves_
void addNode(MoveNode &node)
ProgramOperation()
TODO: this better go, just for testing with empty operation...
std::map< int, MoveNodeSet * > outputMoves_
MoveNodeSet & inputNode(int in) const
std::string toString() const
MoveNode & inputMove(int index) const
bool isAnyOutputAssigned()
bool hasMoveNodeForMove(const TTAProgram::Move &move) const
void removeInputNode(MoveNode &node)
void removeGuardOutputNode(MoveNode &node)
void switchInputs(int idx1=1, int idx2=2)
const TTAMachine::FunctionUnit * fuFromOutMove(const MoveNode &outputNode) const
void removeOutputNode(MoveNode &node, int outputIndex)
bool isLegalFU(const TTAMachine::FunctionUnit &fu) const
void addInputNode(MoveNode &node)
MoveNode & outputMove(int index) const
int outputIndexOfMove(const MoveNode &mn) const
static unsigned int idCounter
MoveNodeSet & outputNode(int out) const
void setOperation(const Operation &op)
const Operation * operation_
bool hasConstantOperand() const
FunctionUnit * parentUnit() const
virtual bool isTriggering() const =0
virtual TCEString name() const
virtual bool isTriggering() const
virtual HWOperation * operation(const std::string &name) const
virtual bool hasOperation(const std::string &name) const
virtual BaseFUPort * port(const std::string &name) const
int io(const FUPort &port) const
Unit * parentUnit() const
virtual int portCount() const
bool hasAnnotation(ProgramAnnotation::Id id, const TCEString &data) const
const TTAMachine::Guard & guard() const
MoveGuard & guard() const
bool isUnconditional() const
Terminal & source() const
Terminal & destination() const
void setDestination(Terminal *dst)
@ ANN_REJECTED_UNIT_SRC
Src. unit rejected.
@ ANN_REJECTED_UNIT_DST
Dst. unit rejected.
void setHintOperation(const char *name)
virtual Operation & hintOperation() const
virtual int operationIndex() const
virtual const TTAMachine::Port & port() const
virtual bool isFUPort() const