Skip to content

Commit

Permalink
Added API getDerivedUnits
Browse files Browse the repository at this point in the history
  • Loading branch information
adeas31 authored and OpenModelica-Hudson committed Mar 22, 2016
1 parent b98debe commit 05d473a
Show file tree
Hide file tree
Showing 7 changed files with 76 additions and 0 deletions.
9 changes: 9 additions & 0 deletions Compiler/FrontEnd/ModelicaBuiltin.mo
Expand Up @@ -2037,6 +2037,15 @@ annotation(preferredView="text",Documentation(info="<html>
</html>"));
end convertUnits;

function getDerivedUnits
input String baseUnit;
output String[:] derivedUnits;
external "builtin";
annotation(preferredView="text",Documentation(info="<html>
<p>Returns the list of derived units for the specified base unit.</p>
</html>"));
end getDerivedUnits;

function listVariables "Lists the names of the active variables in the scripting environment."
output TypeName variables[:];
external "builtin";
Expand Down
31 changes: 31 additions & 0 deletions Compiler/FrontEnd/UnitAbsynBuilder.mo
Expand Up @@ -1550,6 +1550,37 @@ algorithm
unit := UnitAbsyn.SPECIFIED(UnitAbsyn.SPECUNIT(typeParams,units));
end str2unitWithScaleFactor;

protected function getDerivedUnitsHelper
input UnitAbsyn.Unit baseUnit;
input String baseUnitStr;
input list<String> inUnits;
output list<String> outUnits = {};
protected
UnitAbsyn.Unit unit;
Boolean b;
algorithm
for unitStr in inUnits loop
if boolNot(stringEq(baseUnitStr, unitStr)) then // skip same units
unit := str2unit(unitStr, NONE());
b := valueEq(baseUnit, unit);
if b then
outUnits := unitStr::outUnits;
end if;
end if;
end for;
end getDerivedUnitsHelper;

public function getDerivedUnits
input UnitAbsyn.Unit baseUnit;
input String baseUnitStr;
output list<String> derivedUnits;
protected
list<String> unitSymbols;
algorithm
unitSymbols := UnitParserExt.allUnitSymbols();
derivedUnits := getDerivedUnitsHelper(baseUnit, baseUnitStr, unitSymbols);
end getDerivedUnits;

/* Tests */

/* Test1:
Expand Down
5 changes: 5 additions & 0 deletions Compiler/FrontEnd/UnitParserExt.mo
Expand Up @@ -59,6 +59,11 @@ public function str2unit "Translate a unit string to a unit"
external "C" UnitParserExt_str2unit(res,noms,denoms,tpnoms,tpdenoms,tpstrs,scaleFactor,offset) annotation(Library = "omcruntime");
end str2unit;

public function allUnitSymbols
output list<String> unitSymbols;
external "C" unitSymbols = UnitParserExtImpl__allUnitSymbols() annotation(Library = "omcruntime");
end allUnitSymbols;

public function addBase "adds a base unit without weight"
input String name;
external "C" UnitParserExtImpl__addBase(name) annotation(Library = "omcruntime");
Expand Down
14 changes: 14 additions & 0 deletions Compiler/Script/CevalScriptBackend.mo
Expand Up @@ -827,6 +827,20 @@ algorithm
then
(cache,Values.TUPLE({Values.BOOL(false),Values.REAL(1.0),Values.REAL(0.0)}),st);

case (cache,_,"getDerivedUnits",{Values.STRING(str1)},st,_)
equation
Error.clearMessages() "Clear messages";
UnitParserExt.initSIUnits();
u1 = UnitAbsynBuilder.str2unit(str1, NONE());
strs = UnitAbsynBuilder.getDerivedUnits(u1, str1);
v = ValuesUtil.makeArray(List.map(strs, ValuesUtil.makeString));
then
(cache,v,st);

case (cache,_,"getDerivedUnits",{Values.STRING(str1)},st,_)
then
(cache,ValuesUtil.makeArray({}),st);

case (cache,_,"getClassInformation",{Values.CODE(Absyn.C_TYPENAME(className))},st as GlobalScript.SYMBOLTABLE(),_)
equation
v = getClassInformation(className, st.ast);
Expand Down
10 changes: 10 additions & 0 deletions Compiler/runtime/unitparser.cpp
Expand Up @@ -34,6 +34,7 @@
#include <sstream>
#include <stack>
#include "omc_msvc.h" /* For round() */
#include "meta_modelica.h"

#ifndef NO_LPLIB

Expand Down Expand Up @@ -288,6 +289,15 @@ void UnitParser::addPrefix(const string symbol, Rational exponent) {
_prefix[symbol] = exponent;
}

void* UnitParser::allUnitSymbols()
{
void* res = mmc_mk_nil();
for (map<string, Unit>::iterator p = _units.begin(); p != _units.end(); p++) {
res = mmc_mk_cons(mmc_mk_scon((*p).second.unitSymbol.c_str()), res);
}
return res;
}

void UnitParser::addBase(const string quantityName, const string unitName,

const string unitSymbol, bool prefixAllowed) {
Expand Down
2 changes: 2 additions & 0 deletions Compiler/runtime/unitparser.h
Expand Up @@ -227,6 +227,8 @@ class UnitParser{
/** Add prefix symbols. E.g. "m" has exponent -3, (m=10^-3) */
void addPrefix(const string symbol, Rational exponent);

void* allUnitSymbols();

/**
Add a base quantity/unit
@param prefixAllowed Normally set to true. Should be false for [kg], since we are not allowed to prefix this base unit.
Expand Down
5 changes: 5 additions & 0 deletions Compiler/runtime/unitparserext.cpp
Expand Up @@ -55,6 +55,11 @@ void UnitParserExtImpl__registerWeight(const char *name, double weight)
unitParser->accumulateWeight(name,weight);
}

void* UnitParserExtImpl__allUnitSymbols()
{
return unitParser->allUnitSymbols();
}

void UnitParserExtImpl__addBase(const char *name)
{
//cout << "addBase(" << name << ")"<<endl;
Expand Down

0 comments on commit 05d473a

Please sign in to comment.