Skip to content
This repository was archived by the owner on May 18, 2019. It is now read-only.

Commit a08ef7b

Browse files
perostOpenModelica-Hudson
authored andcommitted
[NF] Fix typing of Clock constructors.
- Fix the Clock() definitions in NFBuiltinFuncs, and use them in NFBuiltinCall.typeClockCall instead of doing argument matching manually. This fixes the typing such that e.g. Clock(1, 2) works. Belonging to [master]: - #2737 - OpenModelica/OpenModelica-testsuite#1059
1 parent 5e59184 commit a08ef7b

File tree

2 files changed

+43
-97
lines changed

2 files changed

+43
-97
lines changed

Compiler/NFFrontEnd/NFBuiltinCall.mo

Lines changed: 34 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -1619,84 +1619,46 @@ protected
16191619
input ExpOrigin.Type origin;
16201620
input SourceInfo info;
16211621
output Expression callExp;
1622-
output Type outType;
1623-
output Variability var;
1622+
output Type outType = Type.CLOCK();
1623+
output Variability var = Variability.PARAMETER;
16241624
protected
1625-
Type arg_ty;
1626-
list<TypedArg> args;
1627-
list<TypedNamedArg> named_args;
16281625
Call ty_call;
1629-
Expression e, e1, e2;
1630-
Type t, t1, t2;
1631-
Variability v, v1, v2;
1626+
list<Expression> args;
1627+
Integer args_count;
1628+
Expression e1, e2;
16321629
algorithm
1633-
ty_call as Call.ARG_TYPED_CALL(_, args, named_args) := Call.typeNormalCall(call, origin, info);
1634-
(callExp, outType, var) := match(args, named_args)
1635-
// Clock() - inferred clock
1636-
case ({}, {})
1637-
then (Expression.CLKCONST(Expression.ClockKind.INFERRED_CLOCK()), Type.CLOCK(), Variability.PARAMETER);
1638-
// Clock(intervalCounter) - integer clock
1639-
case ({(e, Type.INTEGER(), v)}, {})
1640-
then (Expression.CLKCONST(Expression.INTEGER_CLOCK(e, Expression.INTEGER(1))), Type.CLOCK(), Variability.PARAMETER);
1641-
// Clock(intervalCounter, resolution) - integer clock
1642-
case ({(e, Type.INTEGER(), v), (e1, Type.REAL(), v1)}, {})
1643-
algorithm
1644-
e2 := Ceval.evalExp(e1);
1645-
Error.assertionOrAddSourceMessage(Expression.integerValue(e2) >= 1,
1646-
Error.WRONG_VALUE_OF_ARG, {"Clock", "resolution", Expression.toString(e2), ">= 1"}, info);
1647-
then
1648-
(Expression.CLKCONST(Expression.INTEGER_CLOCK(e, e2)), Type.CLOCK(), Variability.PARAMETER);
1649-
// Clock(intervalCounter, resolution=expression) - integer clock
1650-
case ({(e, Type.INTEGER(), v)}, {("resolution", e1, Type.REAL(), v1)})
1651-
algorithm
1652-
e2 := Ceval.evalExp(e1);
1653-
Error.assertionOrAddSourceMessage(Expression.integerValue(e2) >= 1,
1654-
Error.WRONG_VALUE_OF_ARG, {"Clock", "resolution", Expression.toString(e2), ">= 1"}, info);
1655-
then
1656-
(Expression.CLKCONST(Expression.INTEGER_CLOCK(e, e2)), Type.CLOCK(), Variability.PARAMETER);
1657-
// Clock(interval) - real clock
1658-
case ({(e, Type.REAL(), v)}, {})
1659-
then
1660-
(Expression.CLKCONST(Expression.REAL_CLOCK(e)), Type.CLOCK(), Variability.PARAMETER);
1661-
// Clock(condition) - boolean clock
1662-
case ({(e, Type.BOOLEAN(), v)}, {})
1663-
then
1664-
(Expression.CLKCONST(Expression.BOOLEAN_CLOCK(e, Expression.REAL(0.0))), Type.CLOCK(), Variability.PARAMETER);
1665-
// Clock(condition, startInterval) - boolean clock
1666-
case ({(e, Type.BOOLEAN(), v), (e1, Type.REAL(), v1)}, {})
1667-
algorithm
1668-
e2 := Ceval.evalExp(e1);
1669-
Error.assertionOrAddSourceMessage(Expression.realValue(e2) > 0.0,
1670-
Error.WRONG_VALUE_OF_ARG, {"Clock", "startInterval", Expression.toString(e2), "> 0.0"}, info);
1671-
then
1672-
(Expression.CLKCONST(Expression.BOOLEAN_CLOCK(e, e2)), Type.CLOCK(), Variability.PARAMETER);
1673-
// Clock(condition, startInterval=expression) - boolean clock
1674-
case ({(e, Type.BOOLEAN(), v)}, {("startInterval", e1, Type.REAL(), v1)})
1630+
Call.TYPED_CALL(arguments = args) := Call.typeMatchNormalCall(call, origin, info);
1631+
args_count := listLength(args);
1632+
1633+
callExp := match args
1634+
// Clock() - inferred clock.
1635+
case {} then Expression.CLKCONST(Expression.ClockKind.INFERRED_CLOCK());
1636+
// Clock(interval) - real clock.
1637+
case {e1} then Expression.CLKCONST(Expression.ClockKind.REAL_CLOCK(e1));
1638+
case {e1, e2}
16751639
algorithm
1676-
e2 := Ceval.evalExp(e1);
1677-
Error.assertionOrAddSourceMessage(Expression.realValue(e2) > 0.0,
1678-
Error.WRONG_VALUE_OF_ARG, {"Clock", "startInterval", Expression.toString(e2), "> 0.0"}, info);
1679-
then
1680-
(Expression.CLKCONST(Expression.BOOLEAN_CLOCK(e, e2)), Type.CLOCK(), Variability.PARAMETER);
1681-
// Clock(c, solverMethod) - solver clock
1682-
case ({(e, Type.CLOCK(), v), (e1, Type.STRING(), v1)}, {})
1683-
algorithm
1684-
e2 := Ceval.evalExp(e1);
1685-
then
1686-
(Expression.CLKCONST(Expression.SOLVER_CLOCK(e, e2)), Type.CLOCK(), Variability.PARAMETER);
1687-
1688-
// Clock(c, solverMethod=string) - solver clock
1689-
case ({(e, Type.CLOCK(), v)}, {("solverMethod", e1, Type.STRING(), v1)})
1690-
algorithm
1691-
e2 := Ceval.evalExp(e1);
1640+
e2 := Ceval.evalExp(e2);
1641+
1642+
callExp := match Expression.typeOf(e2)
1643+
// Clock(intervalCounter, resolution) - integer clock.
1644+
case Type.INTEGER()
1645+
algorithm
1646+
Error.assertionOrAddSourceMessage(Expression.integerValue(e2) >= 1,
1647+
Error.WRONG_VALUE_OF_ARG, {"Clock", "resolution", Expression.toString(e2), "=> 1"}, info);
1648+
then
1649+
Expression.CLKCONST(Expression.INTEGER_CLOCK(e1, e2));
1650+
1651+
// Clock(condition, startInterval) - boolean clock.
1652+
case Type.REAL()
1653+
then Expression.CLKCONST(Expression.BOOLEAN_CLOCK(e1, e2));
1654+
1655+
// Clock(c, solverMethod) - solver clock.
1656+
case Type.STRING()
1657+
then Expression.CLKCONST(Expression.SOLVER_CLOCK(e1, e2));
1658+
end match;
16921659
then
1693-
(Expression.CLKCONST(Expression.SOLVER_CLOCK(e, e2)), Type.CLOCK(), Variability.PARAMETER);
1660+
callExp;
16941661

1695-
else
1696-
algorithm
1697-
Error.addSourceMessage(Error.WRONG_TYPE_OR_NO_OF_ARGS, {Call.toString(call), "<NO COMPONENT>"}, info);
1698-
then
1699-
fail();
17001662
end match;
17011663
end typeClockCall;
17021664

Compiler/NFFrontEnd/NFBuiltinFuncs.mo

Lines changed: 9 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -300,48 +300,34 @@ constant Function CLOCK_INFERED = Function.FUNCTION(Path.IDENT("Clock"),
300300
CLOCK_DUMMY_NODE, {}, {CLOCK_PARAM}, {}, {}, Type.CLOCK(), DAE.FUNCTION_ATTRIBUTES_BUILTIN, {},
301301
Pointer.createImmutable(FunctionStatus.BUILTIN), Pointer.createImmutable(0));
302302

303-
// Clock(intervalCounter) - clock with Integer interval
303+
// Clock(intervalCounter, resolution = 1) - clock with Integer interval
304304
constant Function CLOCK_INT = Function.FUNCTION(Path.IDENT("Clock"),
305-
CLOCK_DUMMY_NODE, {INT_PARAM}, {CLOCK_PARAM}, {}, {
306-
Slot.SLOT("intervalCounter", SlotType.POSITIONAL, NONE(), NONE(), 1, SlotEvalStatus.NOT_EVALUATED)
307-
}, Type.CLOCK(), DAE.FUNCTION_ATTRIBUTES_BUILTIN, {},
308-
Pointer.createImmutable(FunctionStatus.BUILTIN), Pointer.createImmutable(0));
309-
310-
// Clock(intervalCounter, resolution) - clock with Integer interval
311-
constant Function CLOCK_INT_RESOLUTION = Function.FUNCTION(Path.IDENT("Clock"),
312305
CLOCK_DUMMY_NODE, {INT_PARAM, INT_PARAM}, {CLOCK_PARAM}, {}, {
313-
Slot.SLOT("intervalCounter", SlotType.POSITIONAL, NONE(), NONE(), 1, SlotEvalStatus.NOT_EVALUATED),
314-
Slot.SLOT("resolution", SlotType.NAMED, SOME(Expression.INTEGER(1)), NONE(), 2, SlotEvalStatus.NOT_EVALUATED)
306+
Slot.SLOT("intervalCounter", SlotType.GENERIC, NONE(), NONE(), 1, SlotEvalStatus.NOT_EVALUATED),
307+
Slot.SLOT("resolution", SlotType.GENERIC, SOME(Expression.INTEGER(1)), NONE(), 2, SlotEvalStatus.NOT_EVALUATED)
315308
}, Type.CLOCK(), DAE.FUNCTION_ATTRIBUTES_BUILTIN, {},
316309
Pointer.createImmutable(FunctionStatus.BUILTIN), Pointer.createImmutable(0));
317310

318311
// Clock(interval) - clock with Real interval
319312
constant Function CLOCK_REAL = Function.FUNCTION(Path.IDENT("Clock"),
320313
CLOCK_DUMMY_NODE, {REAL_PARAM}, {CLOCK_PARAM}, {}, {
321-
Slot.SLOT("interval", SlotType.POSITIONAL, NONE(), NONE(), 1, SlotEvalStatus.NOT_EVALUATED)
314+
Slot.SLOT("interval", SlotType.GENERIC, NONE(), NONE(), 1, SlotEvalStatus.NOT_EVALUATED)
322315
}, Type.CLOCK(), DAE.FUNCTION_ATTRIBUTES_BUILTIN, {},
323316
Pointer.createImmutable(FunctionStatus.BUILTIN), Pointer.createImmutable(0));
324317

325-
// Clock(condition) - Boolean clock, triggered by zero-crossing events
318+
// Clock(condition, startInterval = 0.0) - Boolean clock, triggered by zero-crossing events
326319
constant Function CLOCK_BOOL = Function.FUNCTION(Path.IDENT("Clock"),
327-
CLOCK_DUMMY_NODE, {BOOL_PARAM}, {CLOCK_PARAM}, {}, {
328-
Slot.SLOT("condition", SlotType.POSITIONAL, NONE(), NONE(), 1, SlotEvalStatus.NOT_EVALUATED)
329-
}, Type.CLOCK(), DAE.FUNCTION_ATTRIBUTES_BUILTIN, {},
330-
Pointer.createImmutable(FunctionStatus.BUILTIN), Pointer.createImmutable(0));
331-
332-
// Clock(condition, startInterval) - Boolean clock, triggered by zero-crossing events
333-
constant Function CLOCK_BOOL_INTERVAL = Function.FUNCTION(Path.IDENT("Clock"),
334320
CLOCK_DUMMY_NODE, {BOOL_PARAM, REAL_PARAM}, {CLOCK_PARAM}, {}, {
335-
Slot.SLOT("condition", SlotType.POSITIONAL, NONE(), NONE(), 1, SlotEvalStatus.NOT_EVALUATED),
336-
Slot.SLOT("startInterval", SlotType.NAMED, SOME(Expression.REAL(0.0)), NONE(), 2, SlotEvalStatus.NOT_EVALUATED)
321+
Slot.SLOT("condition", SlotType.GENERIC, NONE(), NONE(), 1, SlotEvalStatus.NOT_EVALUATED),
322+
Slot.SLOT("startInterval", SlotType.GENERIC, SOME(Expression.REAL(0.0)), NONE(), 2, SlotEvalStatus.NOT_EVALUATED)
337323
}, Type.CLOCK(), DAE.FUNCTION_ATTRIBUTES_BUILTIN, {},
338324
Pointer.createImmutable(FunctionStatus.BUILTIN), Pointer.createImmutable(0));
339325

340326
// Clock(c, solverMethod) - Solver clock
341327
constant Function CLOCK_SOLVER = Function.FUNCTION(Path.IDENT("Clock"),
342328
CLOCK_DUMMY_NODE, {CLOCK_PARAM, STRING_PARAM}, {CLOCK_PARAM}, {}, {
343-
Slot.SLOT("condition", SlotType.POSITIONAL, NONE(), NONE(), 1, SlotEvalStatus.NOT_EVALUATED),
344-
Slot.SLOT("solverMethod", SlotType.NAMED, NONE(), NONE(), 2, SlotEvalStatus.NOT_EVALUATED)
329+
Slot.SLOT("c", SlotType.GENERIC, NONE(), NONE(), 1, SlotEvalStatus.NOT_EVALUATED),
330+
Slot.SLOT("solverMethod", SlotType.GENERIC, NONE(), NONE(), 2, SlotEvalStatus.NOT_EVALUATED)
345331
}, Type.CLOCK(), DAE.FUNCTION_ATTRIBUTES_BUILTIN, {},
346332
Pointer.createImmutable(FunctionStatus.BUILTIN), Pointer.createImmutable(0));
347333

@@ -354,10 +340,8 @@ constant InstNode CLOCK_NODE = InstNode.CLASS_NODE("Clock",
354340
NFInstNode.CachedData.FUNCTION({
355341
CLOCK_INFERED,
356342
CLOCK_INT,
357-
CLOCK_INT_RESOLUTION,
358343
CLOCK_REAL,
359344
CLOCK_BOOL,
360-
CLOCK_BOOL_INTERVAL,
361345
CLOCK_SOLVER
362346
},
363347
true, true),

0 commit comments

Comments
 (0)