7 #ifndef RRLLVM_GETINITIALVALUECODEGENBASE_H_
8 #define RRLLVM_GETINITIALVALUECODEGENBASE_H_
10 #include "CodeGenBase.h"
11 #include "ModelGeneratorContext.h"
12 #include "SymbolForest.h"
13 #include "ASTNodeFactory.h"
14 #include "ModelDataIRBuilder.h"
15 #include "ModelInitialValueSymbolResolver.h"
16 #include "LLVMException.h"
18 #include <sbml/Model.h>
19 #include <Poco/Logger.h>
25 typedef double (*GetInitialValueCodeGenBase_FunctionPtr)(LLVMModelData*, size_t);
30 template <
typename Derived,
bool substanceUnits>
32 public CodeGenBase<GetInitialValueCodeGenBase_FunctionPtr>
38 llvm::Value* codeGen();
40 typedef GetInitialValueCodeGenBase_FunctionPtr FunctionPtr;
44 template <
typename Derived,
bool substanceUnits>
47 CodeGenBase<GetInitialValueCodeGenBase_FunctionPtr>(mgc)
51 template <
typename Derived,
bool substanceUnits>
52 GetInitialValueCodeGenBase<Derived, substanceUnits>::~GetInitialValueCodeGenBase()
56 template <
typename Derived,
bool substanceUnits>
57 llvm::Value* GetInitialValueCodeGenBase<Derived, substanceUnits>::codeGen()
60 llvm::Type* argTypes[] = {
62 llvm::Type::getInt32Ty(this->context)
65 const char* argNames[] = {
66 "modelData", Derived::IndexArgName
69 llvm::Value* args[] = { 0, 0 };
71 llvm::BasicBlock* entry = this->codeGenHeader(Derived::FunctionName, llvm::Type::getDoubleTy(this->context),
72 argTypes, argNames, args);
74 std::vector<std::string> ids =
static_cast<Derived*
>(
this)->getIds();
76 ModelInitialValueSymbolResolver resolver(args[0], this->modelGenContext);
79 llvm::BasicBlock* def = llvm::BasicBlock::Create(this->context,
"default", this->
function);
80 this->builder.SetInsertPoint(def);
82 this->builder.CreateRet(llvm::ConstantFP::get(this->context,
83 llvm::APFloat::getQNaN(llvm::APFloat::IEEEdouble())));
87 this->builder.SetInsertPoint(entry);
89 llvm::SwitchInst* s = this->builder.CreateSwitch(args[1], def,
static_cast<unsigned int>(ids.size()));
91 for (
int i = 0; i < ids.size(); ++i)
93 llvm::BasicBlock* block = llvm::BasicBlock::Create(this->context, ids[i] +
"_block", this->
function);
94 this->builder.SetInsertPoint(block);
97 llvm::Value* value = resolver.loadSymbolValue(ids[i]);
101 const libsbml::SBase* sbase =
const_cast<libsbml::Model*
>(model)->getElementBySId(ids[i]);
102 if (sbase && sbase->getTypeCode() == libsbml::SBML_SPECIES)
104 const libsbml::Species* species =
static_cast<const libsbml::Species*
>(sbase);
105 if (species->getHasOnlySubstanceUnits())
107 value->setName(ids[i] +
"_amt");
112 llvm::Value* comp = resolver.loadSymbolValue(species->getCompartment());
113 value = this->builder.CreateFDiv(value, comp, ids[i] +
"_conc");
118 value->setName(ids[i] +
"_conc");
123 llvm::Value* comp = resolver.loadSymbolValue(species->getCompartment());
124 value = this->builder.CreateFMul(value, comp, ids[i] +
"_amt");
130 value->setName(ids[i] +
"_value");
132 this->builder.CreateRet(value);
133 s->addCase(llvm::ConstantInt::get(llvm::Type::getInt32Ty(this->context), i), block);
136 return this->verifyFunction();
a convenience class to pull the vars out of a context, and store them as ivars.
Definition: CodeGenBase.h:54
Base class for getting the initial value of an element.
Definition: GetInitialValueCodeGenBase.h:33
static llvm::StructType * getStructType(llvm::Module *module)
get the ModelData struct type.
Definition: ModelDataIRBuilder.cpp:731
All LLVM code generating objects basically need at a minimum three things to operate:
Definition: ModelGeneratorContext.h:95