/
FCore.mo
779 lines (647 loc) · 21.1 KB
/
FCore.mo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
/*
* This file is part of OpenModelica.
*
* Copyright (c) 1998-2014, Open Source Modelica Consortium (OSMC),
* c/o Linköpings universitet, Department of Computer and Information Science,
* SE-58183 Linköping, Sweden.
*
* All rights reserved.
*
* THIS PROGRAM IS PROVIDED UNDER THE TERMS OF GPL VERSION 3 LICENSE OR
* THIS OSMC PUBLIC LICENSE (OSMC-PL) VERSION 1.2.
* ANY USE, REPRODUCTION OR DISTRIBUTION OF THIS PROGRAM CONSTITUTES
* RECIPIENT'S ACCEPTANCE OF THE OSMC PUBLIC LICENSE OR THE GPL VERSION 3,
* ACCORDING TO RECIPIENTS CHOICE.
*
* The OpenModelica software and the Open Source Modelica
* Consortium (OSMC) Public License (OSMC-PL) are obtained
* from OSMC, either from the above address,
* from the URLs: http://www.ida.liu.se/projects/OpenModelica or
* http://www.openmodelica.org, and in the OpenModelica distribution.
* GNU version 3 is obtained from: http://www.gnu.org/copyleft/gpl.html.
*
* This program is distributed WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE, EXCEPT AS EXPRESSLY SET FORTH
* IN THE BY RECIPIENT SELECTED SUBSIDIARY LICENSE CONDITIONS OF OSMC-PL.
*
* See the full OSMC Public License conditions for more details.
*
*/
encapsulated package FCore
" file: FCore.mo
package: FCore
description: Structures to hold Modelica constructs
This module holds types used in FNode, FGraph and all the other F* packages
"
public
import Absyn;
import AvlSetCR;
import DAE;
import Mutable;
import SCode;
import Prefix;
protected
import DAEUtil;
import Config;
// ************************ FNode structures ***************************
// ************************ FNode structures ***************************
// ************************ FNode structures ***************************
// ************************ FNode structures ***************************
public
type Name = String "an identifier is just a string";
type Names = list<Name> "list of names";
type Import = Absyn.Import;
type Id = Integer;
type Seq = Integer;
type Next = Seq;
constant ImportTable emptyImportTable = IMPORT_TABLE(false, {}, {});
uniontype ImportTable
record IMPORT_TABLE
// Imports should not be inherited, but removing them from the node
// when doing lookup through extends causes problems for the lookup later
// on, because for example components may have types that depends on
// imports. The hidden flag allows the lookup to 'hide' the imports
// temporarily, without actually removing them.
Boolean hidden "If true means that the imports are hidden.";
list<Import> qualifiedImports;
list<Import> unqualifiedImports;
end IMPORT_TABLE;
end ImportTable;
type Ref = Array<Node> "array of 1";
uniontype Node
record N
Name name "node name, class/component/extends name, etc. see also *NodeName in above";
Id id "Unique node id";
Parents parents "A node can have several parents depending on the context";
Children children "List of uniquely named classes and variables";
Data data "More data for this node, Class, Var, etc";
end N;
end Node;
public uniontype ModScope
"Used to know where a modifier came from, for error reporting."
record MS_COMPONENT
String name;
end MS_COMPONENT;
record MS_EXTENDS
Absyn.Path path;
end MS_EXTENDS;
record MS_DERIVED
Absyn.Path path;
end MS_DERIVED;
record MS_CLASS_EXTENDS
String name;
end MS_CLASS_EXTENDS;
record MS_CONSTRAINEDBY
Absyn.Path path;
end MS_CONSTRAINEDBY;
end ModScope;
uniontype Data
record TOP "top"
end TOP;
record IT
DAE.Var i "instantiated component";
end IT;
record IM "import"
ImportTable i "imports";
end IM;
record CL "class"
SCode.Element e;
Prefix.Prefix pre;
DAE.Mod mod "modification";
Kind kind "usedefined, builtin, basic type";
Status status "if it is untyped, typed or fully instantiated (dae)";
end CL;
record CO "component"
SCode.Element e;
DAE.Mod mod "modification";
Kind kind "usedefined, builtin, basic type";
Status status "if it is untyped, typed or fully instantiated (dae)";
end CO;
record EX "extends"
SCode.Element e;
DAE.Mod mod "modification";
end EX;
record DU "units"
list<SCode.Element> els;
end DU;
record FT "function type nodes"
list<DAE.Type> tys "list since several types with the same name can exist in the same scope (overloading)";
end FT;
record AL "algorithm section"
Name name "al or ial (initial)";
list<SCode.AlgorithmSection> a;
end AL;
record EQ "equation section"
Name name "eq or ieq (initial)";
list<SCode.Equation> e;
end EQ;
record OT "optimization"
list<SCode.ConstraintSection> constrainLst;
list<Absyn.NamedArg> clsAttrs;
end OT;
record ED "external declaration"
SCode.ExternalDecl ed;
end ED;
record FS "for iterators scope"
Absyn.ForIterators fis;
end FS;
record FI "for iterator"
Absyn.ForIterator fi;
end FI;
record MS "match scope"
Absyn.Exp e;
end MS;
record MO "mod"
SCode.Mod m;
end MO;
record EXP "binding, condition, array dim, etc"
String name "what is the expression for";
Absyn.Exp e;
end EXP;
record CR "component reference"
Absyn.ComponentRef r;
end CR;
record DIMS "dimensions"
String name "what are the dimensions for, type or component";
Absyn.ArrayDim dims;
end DIMS;
record CC "constrainedby class"
SCode.ConstrainClass cc;
end CC;
record REF "reference node"
Scope target;
end REF;
record ND "no data"
Option<ScopeType> scopeType;
end ND;
record VR "version node, contains the node that decided the generation of the clone"
Scope source;
Prefix.Prefix p;
DAE.Mod m;
Option<ScopeType> scopeType;
end VR;
record ASSERT "an assertion node, to be used in places
where we want to assert things in the graph.
for example if we looked up A.B from A.B.C.D
but could not find C then we add an assertion
node. we have just a message here but might
add new info later on."
String message;
end ASSERT;
record STATUS "status node"
Boolean isInstantiating;
end STATUS;
end Data;
type Refs = list<Ref>;
type Parents = Refs;
type Scope = Refs;
type Children = RefTree.Tree;
public constant Scope emptyScope = {} "empty scope";
encapsulated package RefTree
import BaseAvlTree;
import FCore.Name;
import FCore.Ref;
import FCore.Node;
extends BaseAvlTree;
redeclare type Key = Name;
redeclare type Value = Ref;
redeclare function extends keyStr
algorithm
outString := inKey;
end keyStr;
redeclare function extends valueStr
algorithm
Node.N(name = outString) := arrayGet(inValue, 1);
end valueStr;
redeclare function extends keyCompare
algorithm
outResult := stringCompare(inKey1, inKey2);
end keyCompare;
end RefTree;
uniontype Kind
record USERDEFINED end USERDEFINED;
record BUILTIN end BUILTIN;
record BASIC_TYPE end BASIC_TYPE;
end Kind;
public uniontype Status
"Used to distinguish between different phases of the instantiation of a component
A component is first added to environment untyped. It can thereafter be instantiated to get its type
and finally instantiated to produce the DAE. These three states are indicated by this datatype."
record VAR_UNTYPED "Untyped variables, initially added to env"
end VAR_UNTYPED;
record VAR_TYPED "Typed variables, when instantiation to get type has been performed"
end VAR_TYPED;
record VAR_DAE "Typed variables that also have been instantiated to generate dae. Required to distinguish
between typed variables without DAE to know when to skip multiply declared dae elements"
end VAR_DAE;
record VAR_DELETED "A conditional variable that was deleted."
end VAR_DELETED;
record CLS_UNTYPED "just added to the env"
end CLS_UNTYPED;
record CLS_PARTIAL "partially instantiated"
end CLS_PARTIAL;
record CLS_FULL "fully instantiated"
end CLS_FULL;
record CLS_INSTANCE "a class that was generated for a component"
String instanceOf;
end CLS_INSTANCE;
end Status;
// ************************ FVisit structures ***************************
// ************************ FVisit structures ***************************
// ************************ FVisit structures ***************************
// ************************ FVisit structures ***************************
uniontype Visit "Visit Node Info"
record VN "Visit Node Info"
Ref ref "which node it is";
Seq seq "order in which was visited";
end VN;
end Visit;
uniontype Visited "Visited structure is an AvlTree Id <-> Visit"
record V
VAvlTree tree;
Next next "the next visit node id";
end V;
end Visited;
public type VAvlKey = Id;
public type VAvlValue = Visit;
uniontype VAvlTree "The binary tree data structure for visited"
record VAVLTREENODE
Option<VAvlTreeValue> value "Value" ;
Integer height "heigth of tree, used for balancing";
Option<VAvlTree> left "left subtree" ;
Option<VAvlTree> right "right subtree" ;
end VAVLTREENODE;
end VAvlTree;
uniontype VAvlTreeValue "Each node in the binary tree can have a value associated with it."
record VAVLTREEVALUE
VAvlKey key "Key" ;
VAvlValue value "Value" ;
end VAVLTREEVALUE;
end VAvlTreeValue;
constant VAvlTree emptyVAvlTree = VAVLTREENODE(NONE(),0,NONE(),NONE());
// ************************ FGraph structures ***************************
// ************************ FGraph structures ***************************
// ************************ FGraph structures ***************************
// ************************ FGraph structures ***************************
constant Absyn.Path dummyTopModel = Absyn.IDENT("$EMPTY");
constant Extra dummyExtra = EXTRA(dummyTopModel);
constant String recordConstructorSuffix = "$recordconstructor";
constant String forScopeName="$for loop scope$" "a unique scope used in for equations";
constant String forIterScopeName="$foriter loop scope$" "a unique scope used in for iterators";
constant String parForScopeName="$pafor loop scope$" "a unique scope used in parfor loops";
constant String parForIterScopeName="$parforiter loop scope$" "a unique scope used in parfor iterators";
constant String matchScopeName="$match scope$" "a unique scope used by match expressions";
constant String caseScopeName="$case scope$" "a unique scope used by match expressions; to be removed when local decls are deprecated";
constant String patternTypeScope="$pattern type scope$" "a scope for specializing pattern types";
constant list<String> implicitScopeNames={forScopeName,forIterScopeName,parForScopeName,parForIterScopeName,matchScopeName,caseScopeName,patternTypeScope};
uniontype Extra "propagate more info into env if needed"
record EXTRA "propagate more info into env if needed"
Absyn.Path topModel;
end EXTRA;
end Extra;
uniontype Graph "graph"
record G "graph"
Top top "the top node";
Scope scope "current scope";
end G;
record EG "empty graph"
Name name;
end EG;
end Graph;
uniontype Top
record GTOP
array<Graph> graph;
Name name "name of the graph";
Ref node "the top node";
Extra extra "extra information";
end GTOP;
end Top;
public constant Id firstId = 0;
// ************************ Cache structures ***************************
// ************************ Cache structures ***************************
// ************************ Cache structures ***************************
// ************************ Cache structures ***************************
public type StructuralParameters = tuple<AvlSetCR.Tree,list<list<DAE.ComponentRef>>>;
public uniontype Cache
record CACHE
Option<Graph> initialGraph "and the initial environment";
Mutable<DAE.FunctionTree> functions "set of Option<DAE.Function>; NONE() means instantiation started; SOME() means it's finished";
StructuralParameters evaluatedParams "ht of prefixed crefs and a stack of evaluated but not yet prefix crefs";
Absyn.Path modelName "name of the model being instantiated";
Absyn.Program program "send the program around if we don't have a symbol table";
end CACHE;
record NO_CACHE "no cache" end NO_CACHE;
end Cache;
public uniontype ScopeType
record FUNCTION_SCOPE end FUNCTION_SCOPE;
record CLASS_SCOPE end CLASS_SCOPE;
record PARALLEL_SCOPE end PARALLEL_SCOPE;
end ScopeType;
// ************************ functions ***************************
public function next
input Next inext;
output Next onext;
algorithm
onext := inext + 1;
end next;
public function emptyCache
"returns an empty cache"
output Cache cache;
protected
Mutable<DAE.FunctionTree> instFuncs;
StructuralParameters ht;
algorithm
instFuncs := Mutable.create(DAE.AvlTreePathFunction.Tree.EMPTY());
ht := (AvlSetCR.EMPTY(),{});
cache := CACHE(NONE(),instFuncs,ht,Absyn.IDENT("##UNDEFINED##"),Absyn.dummyProgram);
end emptyCache;
public function noCache "returns an empty cache"
output Cache cache;
algorithm
cache := NO_CACHE();
end noCache;
public function addEvaluatedCref
input Cache cache;
input SCode.Variability var;
input DAE.ComponentRef cr;
output Cache ocache;
algorithm
ocache := match (cache,var,cr)
local
Option<Graph> initialGraph;
Mutable<DAE.FunctionTree> functions;
AvlSetCR.Tree ht;
list<list<DAE.ComponentRef>> st;
list<DAE.ComponentRef> crs;
Absyn.Path p;
Absyn.Program program;
case (CACHE(initialGraph,functions,(ht,crs::st),p,program),SCode.PARAM(),_)
then CACHE(initialGraph,functions,(ht,(cr::crs)::st),p,program);
case (CACHE(initialGraph,functions,(ht,{}),p,program),SCode.PARAM(),_)
then CACHE(initialGraph,functions,(ht,{cr}::{}),p,program);
else cache;
end match;
end addEvaluatedCref;
public function getEvaluatedParams
input Cache cache;
output AvlSetCR.Tree ht;
algorithm
CACHE(evaluatedParams=(ht,_)) := cache;
end getEvaluatedParams;
public function printNumStructuralParameters
input Cache cache;
protected
list<DAE.ComponentRef> crs;
algorithm
CACHE(evaluatedParams=(_,crs::_)) := cache;
print("printNumStructuralParameters: " + intString(listLength(crs)) + "\n");
end printNumStructuralParameters;
public function setCacheClassName
input Cache inCache;
input Absyn.Path p;
output Cache outCache;
algorithm
outCache := match(inCache,p)
local
Mutable<DAE.FunctionTree> ef;
StructuralParameters ht;
Option<Graph> igraph;
Absyn.Program program;
case (CACHE(igraph,ef,ht,_,program),_)
then CACHE(igraph,ef,ht,p,program);
else inCache;
end match;
end setCacheClassName;
public function isImplicitScope
input Name inName;
output Boolean isImplicit;
algorithm
isImplicit := matchcontinue(inName)
local
Name id;
case (id) then stringGet(id,1) == 36; // "$"
else false;
end matchcontinue;
end isImplicitScope;
public function getCachedInstFunc
"returns the function in the set"
input Cache inCache;
input Absyn.Path path;
output DAE.Function func;
algorithm
func := match(inCache,path)
local
Mutable<DAE.FunctionTree> ef;
case(CACHE(functions=ef),_)
equation
SOME(func) = DAE.AvlTreePathFunction.get(Mutable.access(ef),path);
then func;
end match;
end getCachedInstFunc;
public function checkCachedInstFuncGuard
"succeeds if the FQ function is in the set of functions"
input Cache inCache;
input Absyn.Path path;
algorithm
_ := match(inCache,path)
local
Mutable<DAE.FunctionTree> ef;
case(CACHE(functions=ef),_) equation
DAE.AvlTreePathFunction.get(Mutable.access(ef),path);
then ();
end match;
end checkCachedInstFuncGuard;
public function getFunctionTree
"Selector function"
input Cache cache;
output DAE.FunctionTree ft;
algorithm
ft := match cache
local
Mutable<DAE.FunctionTree> ef;
case CACHE(functions = ef) then Mutable.access(ef);
else DAE.AvlTreePathFunction.Tree.EMPTY();
end match;
end getFunctionTree;
public function addCachedInstFuncGuard
"adds the FQ path to the set of instantiated functions as NONE().
This guards against recursive functions."
input Cache cache;
input Absyn.Path func "fully qualified function name";
output Cache outCache;
algorithm
outCache := matchcontinue(cache,func)
local
Mutable<DAE.FunctionTree> ef;
Option<Graph> igraph;
StructuralParameters ht;
Absyn.Path p;
Absyn.Program program;
// Don't overwrite SOME() with NONE()
case (_, _)
equation
checkCachedInstFuncGuard(cache, func);
// print("Func quard [there]: " + Absyn.pathString(func) + "\n");
then cache;
case (CACHE(_,ef,_,_,_),Absyn.FULLYQUALIFIED(_))
equation
Mutable.update(ef,DAE.AvlTreePathFunction.add(Mutable.access(ef),func,NONE()));
// print("Func quard [new]: " + Absyn.pathString(func) + "\n");
then cache;
// Non-FQ paths mean aliased functions; do not add these to the cache
case (_,_)
equation
// print("Func quard [unqual]: " + Absyn.pathString(func) + "\n");
then (cache);
end matchcontinue;
end addCachedInstFuncGuard;
public function addDaeFunction
"adds the list<DAE.Function> to the set of instantiated functions"
input Cache inCache;
input list<DAE.Function> funcs "fully qualified function name";
output Cache outCache;
algorithm
outCache := match(inCache,funcs)
local
Mutable<DAE.FunctionTree> ef;
Option<Graph> igraph;
StructuralParameters ht;
Absyn.Path p;
Absyn.Program program;
case (CACHE(_,ef,_,_,_),_)
equation
Mutable.update(ef,DAEUtil.addDaeFunction(funcs, Mutable.access(ef)));
then inCache;
else inCache;
end match;
end addDaeFunction;
public function addDaeExtFunction
"adds the external functions in list<DAE.Function> to the set of instantiated functions"
input Cache inCache;
input list<DAE.Function> funcs "fully qualified function name";
output Cache outCache;
algorithm
outCache := match(inCache,funcs)
local
Mutable<DAE.FunctionTree> ef;
Option<Graph> igraph;
StructuralParameters ht;
Absyn.Path p;
Absyn.Program program;
case (CACHE(_,ef,_,_,_),_)
equation
Mutable.update(ef,DAEUtil.addDaeExtFunction(funcs, Mutable.access(ef)));
then inCache;
else inCache;
end match;
end addDaeExtFunction;
public function getProgramFromCache
input Cache inCache;
output Absyn.Program program;
algorithm
program := match(inCache)
case NO_CACHE() then Absyn.dummyProgram;
case CACHE(program = program) then program;
end match;
end getProgramFromCache;
public function setProgramInCache
input Cache inCache;
input Absyn.Program program;
output Cache outCache;
algorithm
outCache := match(inCache,program)
local
Mutable<DAE.FunctionTree> ef;
StructuralParameters ht;
Absyn.Path p;
Option<Graph> ograph;
case (CACHE(ograph,ef,ht,p,_),_) then CACHE(ograph,ef,ht,p,program);
else inCache;
end match;
end setProgramInCache;
public function setCachedFunctionTree
input Cache inCache;
input DAE.FunctionTree inFunctions;
algorithm
_ := match inCache
case CACHE()
equation
Mutable.update(inCache.functions, inFunctions);
then ();
else ();
end match;
end setCachedFunctionTree;
public function isTyped
"author BZ 2008-06
This function checks wheter an InstStatus is typed or not.
Currently used by Inst.updateComponentsInEnv."
input Status is;
output Boolean b;
algorithm
b := match(is)
case(VAR_UNTYPED()) then false;
else true;
end match;
end isTyped;
public function isDeletedComp
"Returns true if the status indicates a deleted conditional component,
otherwise false."
input Status status;
output Boolean isDeleted;
algorithm
isDeleted := match status
case VAR_DELETED() then true;
else false;
end match;
end isDeletedComp;
public function getCachedInitialGraph "get the initial environment from the cache"
input Cache cache;
output Graph g;
algorithm
g := match(cache)
case (CACHE(initialGraph = SOME(g))) then g;
end match;
end getCachedInitialGraph;
public function setCachedInitialGraph "set the initial environment in the cache"
input output Cache cache;
input Graph g;
algorithm
cache := match cache
local
Mutable<DAE.FunctionTree> ef;
StructuralParameters ht;
Absyn.Path p;
Absyn.Program program;
case CACHE()
algorithm
cache.initialGraph := SOME(g);
then cache;
else cache;
end match;
end setCachedInitialGraph;
public function getRecordConstructorName
"@author: adrpo
adds suffix FCore.recordConstructorSuffix ($recordconstructor)
to the given name. does not do it for MetaModelica"
input Name inName;
output Name outName;
algorithm
outName := if Config.acceptMetaModelicaGrammar() then inName else inName + recordConstructorSuffix;
end getRecordConstructorName;
public function getRecordConstructorPath
input Absyn.Path inPath;
output Absyn.Path outPath;
protected
Name lastId;
algorithm
if Config.acceptMetaModelicaGrammar() then
outPath := inPath;
else
lastId := Absyn.pathLastIdent(inPath);
lastId := getRecordConstructorName(lastId);
outPath := Absyn.pathSetLastIdent(inPath, Absyn.makeIdentPathFromString(lastId));
end if;
end getRecordConstructorPath;
annotation(__OpenModelica_Interface="frontend");
end FCore;