44 VuoCompilerPublishedInputNodeClass::VuoCompilerPublishedInputNodeClass(
string nodeClassName, Module *module) :
60 VuoCompilerPublishedInputNodeClass::VuoCompilerPublishedInputNodeClass(
VuoNodeClass *baseNodeClass) :
88 VuoNodeClass * VuoCompilerPublishedInputNodeClass::newNodeClassWithImplementation(
const string &nodeClassName,
89 const vector<string> &portNames,
const vector<VuoType *> &types)
120 vector<VuoPort *> modelInputPorts;
121 for (
size_t i = 0; i < portNames.size(); ++i)
124 modelInputPorts.push_back(modelPort->
getBase());
127 vector<VuoPort *> modelOutputPorts;
128 for (
size_t i = 0; i < portNames.size(); ++i)
131 modelOutputPorts.push_back(modelPort->
getBase());
134 map<VuoPort *, VuoPortClass::EventBlocking> eventBlockingForInputPorts;
135 for (
VuoPort *modelInputPort : modelInputPorts)
138 map<VuoPort *, size_t> indexOfParameter;
139 map<VuoPort *, size_t> indexOfEventParameter;
143 nullptr, modelInputPorts, modelOutputPorts,
144 map<VuoPort *, json_object *>(), map<VuoPort *, string>(),
145 map<VuoPort *, string>(), eventBlockingForInputPorts,
146 indexOfParameter, indexOfEventParameter, &constantsCache);
148 BasicBlock *initialBlock = &(eventFunction->getEntryBlock());
149 BasicBlock *currBlock = initialBlock;
151 for (
size_t i = 0; i < portNames.size(); ++i)
153 BasicBlock *eventBlock = BasicBlock::Create(
module->getContext(),
"event", eventFunction);
154 BasicBlock *noEventBlock = BasicBlock::Create(
module->getContext(),
"noEvent", eventFunction);
156 VuoType *dataType = types.at(i);
160 size_t inputEventArgIndex = (dataType ? indexOfEventParameter[ modelInputPorts[i] ] : indexOfParameter[ modelInputPorts[i] ]);
163 Constant *falseValue = ConstantInt::get(inputEventArg->getType(), 0);
164 ICmpInst *inputEventIsTrue =
new ICmpInst(*currBlock, ICmpInst::ICMP_NE, inputEventArg, falseValue);
165 BranchInst::Create(eventBlock, noEventBlock, inputEventIsTrue, currBlock);
169 size_t outputEventArgIndex = (dataType ? indexOfEventParameter[ modelOutputPorts[i] ] : indexOfParameter[ modelOutputPorts[i] ]);
172 Constant *trueValue = ConstantInt::get(inputEventArg->getType(), 1);
173 new StoreInst(trueValue, outputEventArg, eventBlock);
179 size_t inputDataArgIndex = indexOfParameter[ modelInputPorts[i] ];
182 size_t outputDataArgIndex = indexOfParameter[ modelOutputPorts[i] ];
188 BranchInst::Create(noEventBlock, eventBlock);
189 currBlock = noEventBlock;
192 ReturnInst::Create(
module->getContext(), currBlock);
197 delete dummyNodeClass;
209 VuoNodeClass * VuoCompilerPublishedInputNodeClass::newNodeClassWithoutImplementation(
const string &nodeClassName,
210 const vector<string> &portNames,
const vector<VuoType *> &types)
212 vector<VuoPortClass *> inputPortClasses;
213 vector<VuoPortClass *> outputPortClasses;
216 inputPortClasses.push_back(refreshPortClass);
218 for (
size_t i = 0; i < portNames.size(); ++i)
230 inputPortClasses.push_back(inputPortClass->
getBase());
233 set<string> takenPortNames;
235 takenPortNames.insert(inputPortClass->getName());
237 for (
size_t i = 0; i < portNames.size(); ++i)
239 string preferredName = portNames.at(i) +
"Out";
250 outputPortClasses.push_back(outputPortClass->
getBase());
253 VuoNodeClass *baseNodeClass =
new VuoNodeClass(nodeClassName, refreshPortClass, inputPortClasses, outputPortClasses);
288 string VuoCompilerPublishedInputNodeClass::getNodeClassNamePrefix(
void)
296 set<string> VuoCompilerPublishedInputNodeClass::getReservedPortNames(
void)
299 names.insert(
"refresh");