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