Skip to content

Commit

Permalink
- Implemented UnitParserExt_omc.cpp
Browse files Browse the repository at this point in the history
git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@7106 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
sjoelund committed Nov 19, 2010
1 parent 68ad0d3 commit d70d44e
Show file tree
Hide file tree
Showing 6 changed files with 273 additions and 150 deletions.
22 changes: 11 additions & 11 deletions Compiler/UnitParserExt.mo
Expand Up @@ -3,7 +3,7 @@ package UnitParserExt "external package interface for UnitParser. Copyright Math
public import UnitAbsyn;

public function initSIUnits "initialize the UnitParser with the SI units"
external "C";
external "C" UnitParserExtImpl__initSIUnits() annotation(Library = {"omcruntime","lpsolve55"});
end initSIUnits;


Expand All @@ -16,7 +16,7 @@ public function unit2str"Translate a unit to a string"
input Real scaleFactor;
input Real offset;
output String res;
external "C";
external "C" res=UnitParserExt_unit2str(noms,denoms,tpnoms,tpdenoms,tpstrs,scaleFactor,offset) annotation(Library = {"omcruntime","lpsolve55"});
end unit2str;

public function str2unit "Translate a unit string to a unit"
Expand All @@ -28,49 +28,49 @@ public function str2unit "Translate a unit string to a unit"
output list<String> tpstrs;
output Real scaleFactor;
output Real offset;
external "C";
external "C" UnitParserExt_str2unit(res,noms,denoms,tpnoms,tpdenoms,tpstrs,scaleFactor,offset) annotation(Library = {"omcruntime","lpsolve55"});
end str2unit;

public function addBase "adds a base unit without weight"
input String name;
external "C";
external "C" UnitParserExt__addBase(name) annotation(Library = {"omcruntime","lpsolve55"});
end addBase;

public function registerWeight "registers a weight to be multiplied with the weigth factor of a derived unit"
input String name;
input Real weight;
external "C";
external "C" UnitParserExtImpl__registerWeight(name,weight) annotation(Library = {"omcruntime","lpsolve55"});
end registerWeight;


public function addDerived "adds a derived unit without weight"
input String name;
input String exp;
external "C";
external "C" UnitParserExtImpl__addDerived(name,exp) annotation(Library = {"omcruntime","lpsolve55"});
end addDerived;

public function addDerivedWeight "adds a derived unit with weight"
input String name;
input String exp;
input Real weight;
external "C";
external "C" UnitParserExtImpl__addDerivedWeight(name,exp,weight) annotation(Library = {"omcruntime","lpsolve55"});
end addDerivedWeight;

public function checkpoint "copies all unitparser information to allow changing unit weights locally for a component"
external "C";
external "C" UnitParserExtImpl__checkpoint() annotation(Library = {"omcruntime","lpsolve55"});
end checkpoint;

public function rollback "rollback the copy made in checkPoint call"
external "C";
external "C" UnitParserExtImpl__rollback() annotation(Library = {"omcruntime","lpsolve55"});
end rollback;

public function clear "clears the unitparser from stored units"
external "C";
external "C" UnitParserExtImpl__clear() annotation(Library = {"omcruntime","lpsolve55"});
end clear;

public function commit "commits all units, must be run before doing unit checking and after last unit has been added
with addBase or addDerived."
external "C";
external "C" UnitParserExtImpl__commit() annotation(Library = {"omcruntime","lpsolve55"});
end commit;

end UnitParserExt;
6 changes: 4 additions & 2 deletions Compiler/runtime/Makefile.in
Expand Up @@ -34,9 +34,9 @@ CXXFLAGS = $(CFLAGS)
CPPFLAGS = -I$(RMLINCLUDE) -I$(top_builddir)/c_runtime -I$(srcdir) -I. $(CORBAINCL) -Ilpsolve
SRC = RTOpts_rml.c socketimpl.c Print_rml.c System_rml.c Settings_rml.c dynload.c SimulationResults.c IOStreamExt_rml.c rtclock.c Database.c

CPPSRC = unitparser.cpp unitparserext.cpp ptolemyio.cpp BackendDAEEXT.cpp ErrorMessage.cpp Error_rml.cpp optmanager.cpp systemimplmisc.cpp dynload_try.o $(CORBASRC)
CPPSRC = unitparser.cpp UnitParserExt_rml.cpp ptolemyio.cpp BackendDAEEXT.cpp ErrorMessage.cpp Error_rml.cpp optmanager.cpp systemimplmisc.cpp dynload_try.o $(CORBASRC)
OBJ = $(SRC:.c=.o) $(CPPSRC:.cpp=.o) $(CPPSRC:.cc=.o)
OMC_OBJ = Error_omc.o Print_omc.o RTOpts_omc.o System_omc.o Settings_omc.o IOStreamExt_omc.o ErrorMessage.o systemimplmisc.o rtclock.o
OMC_OBJ = Error_omc.o Print_omc.o RTOpts_omc.o System_omc.o Settings_omc.o IOStreamExt_omc.o ErrorMessage.o systemimplmisc.o rtclock.o UnitParserExt_omc.o unitparser.o

all: runtime.a install
.PHONY: all install
Expand Down Expand Up @@ -69,6 +69,8 @@ IOStreamExt_rml.o : IOStreamExt.c
IOStreamExt_omc.o : IOStreamExt.c
Settings_rml.o : settingsimpl.c
Settings_omc.o : settingsimpl.c
UnitParserExt_rml.o : unitparserext.cpp unitparser.h
UnitParserExt_omc.o : unitparserext.cpp unitparser.h

clean:
$(RM) -rf *.a *.o omc_communication.cc omc_communication.h omc_communication-*
Expand Down
72 changes: 72 additions & 0 deletions Compiler/runtime/UnitParserExt_omc.cpp
@@ -0,0 +1,72 @@
/* External interface for UnitParserExt module */
#include "unitparser.h"
#include "unitparserext.cpp"
#include "meta_modelica.h"

extern "C"
{


const char* UnitParserExt_unit2str(void *nums, void *denoms, void *tpnoms, void *tpdenoms, void *tpstrs)
{
long int i1,i2;
string tpParam;
Unit unit;
unit.unitVec.clear();
unit.typeParamVec.clear();
/* Add baseunits*/
while(MMC_GETHDR(nums) == MMC_CONSHDR) {
i1 = MMC_UNTAGFIXNUM(MMC_CAR(nums));
i2 = MMC_UNTAGFIXNUM(MMC_CAR(denoms));
unit.unitVec.push_back(Rational(i1,i2));
nums = MMC_CDR(nums);
denoms = MMC_CDR(denoms);
}
/* Add type parameters*/
while(MMC_GETHDR(tpnoms) == MMC_CONSHDR) {
i1 = MMC_UNTAGFIXNUM(MMC_CAR(tpnoms));
i2 = MMC_UNTAGFIXNUM(MMC_CAR(tpdenoms));
tpParam = string(MMC_STRINGDATA(MMC_CAR(tpstrs)));
unit.typeParamVec.insert(std::pair<string,Rational>(tpParam,Rational(i1,i2)));
tpnoms = MMC_CDR(tpnoms);
tpdenoms = MMC_CDR(tpdenoms);
}
//string res = unitParser->unit2str(unit);
string res = unitParser->prettyPrintUnit2str(unit);

return strdup(res.c_str());
}

void UnitParserExt_str2unit(const char *inStr, void **nums, void **denoms, void **tpnoms, void **tpdenoms, void **tpstrs)
{
string str = string(inStr);
Unit unit;
UnitRes res = unitParser->str2unit(str,unit);
if (!res.Ok()) {
std::cerr << "error parsing unit " << str << std::endl;
throw 1;
}

/* Build rml objects */
*nums = mmc_mk_nil();
*denoms = mmc_mk_nil();
*tpnoms = mmc_mk_nil();
*tpdenoms = mmc_mk_nil();
*tpstrs = mmc_mk_nil();
/* baseunits */
vector<Rational>::reverse_iterator rii;
for(rii=unit.unitVec.rbegin(); rii!=unit.unitVec.rend(); ++rii) {
*nums = mmc_mk_cons(mmc_mk_icon(rii->num),*nums);
*denoms = mmc_mk_cons(mmc_mk_icon(rii->denom),*denoms);
}
/* type parameters*/
map<string,Rational>::reverse_iterator rii2;
for(rii2=unit.typeParamVec.rbegin(); rii2!=unit.typeParamVec.rend(); ++rii2) {
*tpnoms = mmc_mk_cons(mmc_mk_icon(rii2->second.num),*tpnoms);
*tpdenoms = mmc_mk_cons(mmc_mk_icon(rii2->second.denom),*tpdenoms);
*tpstrs = mmc_mk_cons(mmc_mk_scon((char*)rii2->first.c_str()),*tpstrs);
}
}

} // extern "C"

160 changes: 160 additions & 0 deletions Compiler/runtime/UnitParserExt_rml.cpp
@@ -0,0 +1,160 @@
/* External interface for UnitParserExt module */
#include "unitparser.h"
#include "unitparserext.cpp"

extern "C"
{
#include "rml.h"


void UnitParserExt_5finit(void)
{
unitParser = new UnitParser;
}

RML_BEGIN_LABEL(UnitParserExt__initSIUnits)
{
UnitParserExtImpl__initSIUnits();
RML_TAILCALLK(rmlSC);
}
RML_END_LABEL

RML_BEGIN_LABEL(UnitParserExt__checkpoint)
{
UnitParserExtImpl__checkpoint();
RML_TAILCALLK(rmlSC);
}
RML_END_LABEL


RML_BEGIN_LABEL(UnitParserExt__rollback)
{
UnitParserExtImpl__rollback();
RML_TAILCALLK(rmlSC);
}
RML_END_LABEL


RML_BEGIN_LABEL(UnitParserExt__clear)
{
UnitParserExtImpl__clear();
RML_TAILCALLK(rmlSC);
}
RML_END_LABEL

RML_BEGIN_LABEL(UnitParserExt__commit)
{
UnitParserExtImpl__commit();
RML_TAILCALLK(rmlSC);
}
RML_END_LABEL


RML_BEGIN_LABEL(UnitParserExt__registerWeight)
{
const char *name = RML_STRINGDATA(rmlA0);
double w = rml_prim_get_real(rmlA1);
UnitParserExtImpl__registerWeight(name,w);
RML_TAILCALLK(rmlSC);
}
RML_END_LABEL

RML_BEGIN_LABEL(UnitParserExt__addBase)
{
const char *name = RML_STRINGDATA(rmlA0);
UnitParserExtImpl__addBase(name);
RML_TAILCALLK(rmlSC);
}
RML_END_LABEL

RML_BEGIN_LABEL(UnitParserExt__addDerived)
{
const char *name = RML_STRINGDATA(rmlA0);
const char *exp = RML_STRINGDATA(rmlA1);
//cout << "addDerived(" << name << ", "<<exp << ")" << endl;
UnitParserExtImpl__addDerived(name,exp);
RML_TAILCALLK(rmlSC);
}
RML_END_LABEL

RML_BEGIN_LABEL(UnitParserExt__addDerivedWeight)
{
const char *name = RML_STRINGDATA(rmlA0);
const char *exp = RML_STRINGDATA(rmlA1);
double w = rml_prim_get_real(rmlA2);
UnitParserExtImpl__addDerivedWeight(name,exp,w);
RML_TAILCALLK(rmlSC);
}
RML_END_LABEL

RML_BEGIN_LABEL(UnitParserExt__unit2str)
{
void* nums=rmlA0; void* denoms=rmlA1; void* tpnoms=rmlA2; void* tpdenoms=rmlA3; void* tpstrs=rmlA4;
long int i1,i2;
string tpParam;
nums = rmlA0;
Unit unit;
unit.unitVec.clear();
unit.typeParamVec.clear();
/* Add baseunits*/
while(RML_GETHDR(nums) == RML_CONSHDR) {
i1 = RML_UNTAGFIXNUM(RML_CAR(nums));
i2 = RML_UNTAGFIXNUM(RML_CAR(denoms));
unit.unitVec.push_back(Rational(i1,i2));
nums = RML_CDR(nums);
denoms = RML_CDR(denoms);
}
/* Add type parameters*/
while(RML_GETHDR(tpnoms) == RML_CONSHDR) {
i1 = RML_UNTAGFIXNUM(RML_CAR(tpnoms));
i2 = RML_UNTAGFIXNUM(RML_CAR(tpdenoms));
tpParam = string(RML_STRINGDATA(RML_CAR(tpstrs)));
unit.typeParamVec.insert(std::pair<string,Rational>(tpParam,Rational(i1,i2)));
tpnoms = RML_CDR(tpnoms);
tpdenoms = RML_CDR(tpdenoms);
}
//string res = unitParser->unit2str(unit);
string res = unitParser->prettyPrintUnit2str(unit);

rmlA0 = (void*) mk_scon((char*)res.c_str());
RML_TAILCALLK(rmlSC);
}
RML_END_LABEL

RML_BEGIN_LABEL(UnitParserExt__str2unit)
{
string str = string(RML_STRINGDATA(rmlA0));
Unit unit;
UnitRes res = unitParser->str2unit(str,unit);
if (!res.Ok()) {
std::cerr << "error parsing unit " << str << std::endl;
RML_TAILCALLK(rmlFC);
}

/* Build rml objects */
void* nums=mk_nil(); void* denoms=mk_nil(); void* tpnoms=mk_nil(); void* tpdenoms=mk_nil(); void* tpstrs=mk_nil();
/* baseunits */
vector<Rational>::reverse_iterator rii;
for(rii=unit.unitVec.rbegin(); rii!=unit.unitVec.rend(); ++rii) {
nums = mk_cons(mk_icon(rii->num),nums);
denoms = mk_cons(mk_icon(rii->denom),denoms);
}
/* type parameters*/
map<string,Rational>::reverse_iterator rii2;
for(rii2=unit.typeParamVec.rbegin(); rii2!=unit.typeParamVec.rend(); ++rii2) {
tpnoms = mk_cons(mk_icon(rii2->second.num),tpnoms);
tpdenoms = mk_cons(mk_icon(rii2->second.denom),tpdenoms);
tpstrs = mk_cons(mk_scon((char*)rii2->first.c_str()),tpstrs);
}

rmlA0 = (void*)nums;
rmlA1 = (void*)denoms;
rmlA2 = (void*)tpnoms;
rmlA3 = (void*)tpdenoms;
rmlA4 = (void*)tpstrs;
RML_TAILCALLK(rmlSC);
}
RML_END_LABEL

} // extern "C"

0 comments on commit d70d44e

Please sign in to comment.