Vuo  2.0.0
VuoCompilerBitcodeGenerator.hh
Go to the documentation of this file.
1 
10 #pragma once
11 
13 
14 class VuoCompiler;
15 class VuoCompilerChain;
17 class VuoCompilerGraph;
18 class VuoCompilerNode;
19 class VuoCompilerPort;
22 class VuoCompilerType;
23 class VuoPort;
24 class VuoType;
25 
30 {
31 private:
32  VuoCompilerComposition *composition;
33  VuoCompiler *compiler;
34  VuoCompilerGraph *graph;
35 
38  bool isTopLevelComposition;
39 
41  string moduleKey;
42 
44  vector<VuoPort *> modelInputPorts;
45 
47  vector<VuoPort *> modelOutputPorts;
48 
50  map<VuoCompilerTriggerPort *, vector<VuoCompilerChain *> > chainsForTrigger;
51 
53  map<VuoCompilerTriggerPort *, vector<VuoCompilerNode *> > downstreamNodesForTrigger;
54 
56  vector<VuoCompilerNode *> orderedNodes;
57 
59  vector<VuoCompilerType *> orderedTypes;
60 
62  set<string> dependencies;
63 
65  Module *module;
66 
68  VuoCompilerConstantStringCache constantStrings;
69 
71  map<VuoCompilerNode *, Function *> executionFunctionForNode;
72 
74  map<VuoCompilerNode *, Function *> transmissionFunctionForNode;
75 
77  map<VuoCompilerTriggerPort *, Function *> topLevelTriggerFunctions;
78 
80  map<string, map<size_t, map<VuoCompilerTriggerDescription *, Function *> > > subcompositionTriggerFunctions;
81 
82  bool debugMode;
83 
84  VuoCompilerBitcodeGenerator(VuoCompilerComposition *composition, bool isTopLevelComposition, string moduleKey, VuoCompiler *compiler);
85  void makeOrderedNodes(void);
86  void sortNodes(vector<VuoCompilerNode *> &nodes);
87  vector<VuoCompilerNode *> getNodesToWaitOnBeforeTransmission(VuoCompilerTriggerPort *trigger);
88  vector<VuoCompilerNode *> getNodesToWaitOnBeforeTransmission(VuoCompilerTriggerPort *trigger, VuoCompilerNode *node);
89  void makeOrderedTypes(void);
90  void makePortContextInfo(void);
91  void makeSubcompositionModelPorts(void);
92  void makeDependencies(void);
93  void generateShouldShowSplashWindowFunction(bool shouldShow);
94  void generateCompositionMetadata(void);
95  void generateCompositionAddNodeMetadataFunction(void);
96  void generateCompositionCreateContextForNodeFunction(void);
97  void generateCompositionPerformDataOnlyTransmissionsFunction(void);
98  void generateCompositionReleasePortDataFunction(void);
99  void generateSetInputDataFromNodeFunctionArguments(Function *function, BasicBlock *&block, Value *compositionStateValue, map<VuoPort *, size_t> indexOfParameter, map<VuoPort *, size_t> indexOfEventParameter, bool shouldWaitForDataOnlyDownstreamNodes, bool shouldUpdateTriggers, bool shouldSendTelemetry);
100  void generateNodeEventFunction(bool isStatefulComposition);
101  void generateNodeInstanceInitFunction(void);
102  void generateNodeInstanceFiniFunction(void);
103  void generateNodeInstanceTriggerStartFunction(void);
104  void generateNodeInstanceTriggerStopFunction(void);
105  void generateNodeInstanceTriggerUpdateFunction(void);
106  Value * generateWaitForNodes(Module *module, Function *function, BasicBlock *&block, Value *compositionStateValue, vector<VuoCompilerNode *> nodes, Value *eventIdValue = NULL, bool shouldBlock = true);
107  void generateCompositionWaitForNodeFunction(void);
108  void generateSignalForNodes(Module *module, BasicBlock *block, Value *compositionStateValue, vector<VuoCompilerNode *> nodes);
109  void generateCompositionGetPortValueFunction(void);
110  void generateCompositionSetPortValueFunction(void);
111  void generateSetInputPortValueFunction(void);
112  void generateCompositionFireTriggerPortEventFunction(void);
113  void generateGetPublishedPortCountFunction(bool input);
114  void generateGetPublishedPortNamesFunction(bool input);
115  void generateGetPublishedPortTypesFunction(bool input);
116  void generateGetPublishedPortDetailsFunction(bool input);
117  void generateFunctionReturningStringArray(string functionName, vector<string> stringValues);
118  void generateFirePublishedInputPortEventFunction(void);
119  void generateGetPublishedPortValueFunction(bool input);
120  void generateCompositionSetPublishedInputPortValueFunction(void);
121  void generateSetPublishedInputPortValueFunction(void);
122  void generateTransmissionFromOutputPort(Function *function, BasicBlock *&currentBlock, Value *compositionStateValue, VuoCompilerPort *outputPort, Value *eventValue, Value *dataValue, bool requiresEvent = true, bool shouldSendTelemetry = true);
123  void generateTransmissionFromNode(Function *function, BasicBlock *&currentBlock, Value *compositionStateValue, Value *nodeContextValue, VuoCompilerNode *node, bool requiresEvent = true, bool shouldSendTelemetry = true);
124  void generateTelemetryFromPublishedOutputNode(Function *function, BasicBlock *&currentBlock, Value *compositionStateValue, Value *nodeContextValue, VuoCompilerNode *node);
125  void generateDataOnlyTransmissionFromNode(Function *function, BasicBlock *&currentBlock, Value *compositionStateValue, VuoCompilerNode *node, bool shouldWaitForDownstreamNodes, bool shouldUpdateTriggers, bool shouldSendTelemetry);
126  void generateNodeExecution(Function *function, BasicBlock *&currentBlock, Value *compositionStateValue, VuoCompilerNode *node, bool shouldSendTelemetry = true);
127  void generateAllocation(void);
128  void generateSetupFunction(bool isStatefulComposition);
129  void generateCleanupFunction(void);
130  void generateInstanceInitFunction(bool isStatefulComposition);
131  void generateInstanceFiniFunction(bool isStatefulComposition);
132  void generateInstanceTriggerStartFunction(bool isStatefulComposition);
133  void generateInstanceTriggerStopFunction(bool isStatefulComposition);
134  void generateTriggerFunctions(void);
135  Function * generateTriggerSchedulerFunction(VuoType *dataType, string compositionIdentifier, size_t nodeIndex,
136  string portIdentifier, int portContextIndex, bool canDropEvents, bool isPublishedInputTrigger, bool isSpinOff, int minThreadsNeeded, int maxThreadsNeeded, int chainCount,
137  Function *workerFunction);
138  Function * generateTriggerWorkerFunction(VuoCompilerTriggerPort *trigger);
139  void generateAndScheduleChainWorkerFunctions(BasicBlock *schedulerBlock, Value *compositionStateValueInScheduler, Value *contextValueInScheduler, const vector<VuoCompilerChain *> &chainsToSchedule, VuoCompilerTriggerPort *trigger, const vector<VuoCompilerChain *> &allChains,
140  const map<VuoCompilerChain *, vector<VuoCompilerChain *> > &chainsImmediatelyDownstream, const map<VuoCompilerChain *, vector<VuoCompilerChain *> > &chainsImmediatelyUpstream,
141  set<VuoCompilerChain *> &chainsScheduled);
142  void generateAndScheduleChainWorkerFunction(BasicBlock *schedulerBlock, Value *compositionStateValueInScheduler, Value *contextValueInScheduler, VuoCompilerChain *chain, VuoCompilerTriggerPort *trigger, const vector<VuoCompilerChain *> &allChains,
143  const map<VuoCompilerChain *, vector<VuoCompilerChain *> > &chainsImmediatelyDownstream, const map<VuoCompilerChain *, vector<VuoCompilerChain *> > &chainsImmediatelyUpstream,
144  set<VuoCompilerChain *> &chainsScheduled);
145  void generateChainExecution(Function *function, BasicBlock *&block, Value *compositionStateValue, Value *contextValue, Value *eventIdValue, VuoCompilerChain *chain, VuoCompilerTriggerPort *trigger, const vector<VuoCompilerChain *> &allChains,
146  const map<VuoCompilerChain *, vector<VuoCompilerChain *> > &chainsImmediatelyDownstream, const map<VuoCompilerChain *, vector<VuoCompilerChain *> > &chainsImmediatelyUpstream,
147  set<VuoCompilerChain *> &chainsScheduled);
148  Function * generateNodeExecutionFunction(Module *module, VuoCompilerNode *node);
149  Function * generateNodeTransmissionFunction(Module *module, VuoCompilerNode *node);
150 
151  friend class TestVuoCompilerBitcodeGenerator;
152  friend class TestVuoCompilerGraphExecution;
153  friend class TestControlAndTelemetry;
154  friend class TestNodeExecutionOrderRunnerDelegate;
155 
156 public:
158  bool isTopLevelComposition,
159  string moduleKey, VuoCompiler *compiler);
161  Module * generateBitcode(void);
162  void setDebugMode(bool debugMode);
163 
164 #ifdef VUO_PRO
165 #include "pro/VuoCompilerBitcodeGenerator_Pro.hh"
166 #endif
167 };