Skip to content

Commit 1b68213

Browse files
committed
Port some parts of OpenModelica#13640
- Clean up loading of ModelicaBuiltin. - Optimize `getPathedClassInProgram`, do the lookup directly in the class parts instead of creating a list of all classes first.
1 parent 3302d94 commit 1b68213

File tree

3 files changed

+104
-253
lines changed

3 files changed

+104
-253
lines changed

OMCompiler/Compiler/FFrontEnd/FBuiltin.mo

Lines changed: 57 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@ protected import Config;
5353
protected import Flags;
5454
protected import FGraphBuild;
5555
protected import Global;
56-
protected import List;
5756
protected import MetaUtil;
5857
protected import Parser;
5958
protected import AbsynToSCode;
@@ -351,6 +350,14 @@ algorithm
351350
end match;
352351
end isDer;
353352

353+
protected function mergePrograms
354+
input Absyn.Program program1;
355+
input Absyn.Program program2;
356+
output Absyn.Program outProgram = program1;
357+
algorithm
358+
outProgram.classes := listAppend(program1.classes, program2.classes);
359+
end mergePrograms;
360+
354361
public function getInitialFunctions
355362
"Fetches the Absyn.Program representation of the functions (and other classes) in the initial environment"
356363
output Absyn.Program initialProgram;
@@ -359,8 +366,7 @@ protected
359366
// legend: NF = new frontend; CF = current frontend
360367
String fileModelicaNF,fileModelicaCF,fileMetaModelica,fileParModelica,filePDEModelica;
361368
list<tuple<tuple<Integer,Boolean>,tuple<Absyn.Program,SCode.Program>>> assocLst;
362-
list<Absyn.Class> classesNF,classesCF,classes1NF,classes1CF,classes2;
363-
Absyn.Program p, pNF, pCF;
369+
Absyn.Program p, pNF, pCF, pMM;
364370
SCode.Program sp, spNF, spCF;
365371
algorithm
366372
fileModelicaNF := Settings.getInstallationDirectoryPath() + "/lib/omc/NFModelicaBuiltin.mo";
@@ -371,86 +377,80 @@ algorithm
371377

372378
(initialProgram,initialSCodeProgram) := matchcontinue ()
373379
case ()
374-
equation
375-
failure(_ = getGlobalRoot(Global.builtinIndex));
380+
algorithm
381+
failure(_ := getGlobalRoot(Global.builtinIndex));
376382
setGlobalRoot(Global.builtinIndex,{});
377383
then fail();
378384
case ()
379-
equation
380-
assocLst = getGlobalRoot(Global.builtinIndex);
381-
((p,sp)) = Util.assoc(Util.makeTuple(Flags.getConfigEnum(Flags.GRAMMAR), Flags.isSet(Flags.SCODE_INST)) , assocLst);
385+
algorithm
386+
assocLst := getGlobalRoot(Global.builtinIndex);
387+
((p,sp)) := Util.assoc(Util.makeTuple(Flags.getConfigEnum(Flags.GRAMMAR), Flags.isSet(Flags.SCODE_INST)) , assocLst);
382388
then (p,sp);
383389
case ()
384-
equation
385-
true = intEq(Flags.getConfigEnum(Flags.GRAMMAR), Flags.METAMODELICA);
390+
algorithm
391+
true := intEq(Flags.getConfigEnum(Flags.GRAMMAR), Flags.METAMODELICA);
386392
Error.assertionOrAddSourceMessage(System.regularFileExists(fileModelicaNF),Error.FILE_NOT_FOUND_ERROR,{fileModelicaNF},AbsynUtil.dummyInfo);
387393
Error.assertionOrAddSourceMessage(System.regularFileExists(fileModelicaCF),Error.FILE_NOT_FOUND_ERROR,{fileModelicaCF},AbsynUtil.dummyInfo);
388394
Error.assertionOrAddSourceMessage(System.regularFileExists(fileMetaModelica),Error.FILE_NOT_FOUND_ERROR,{fileMetaModelica},AbsynUtil.dummyInfo);
389-
Absyn.PROGRAM(classes=classes1NF,within_=Absyn.TOP()) = Parser.parsebuiltin(fileModelicaNF,"UTF-8","",NONE(),acceptedGram=Flags.METAMODELICA);
390-
Absyn.PROGRAM(classes=classes1CF,within_=Absyn.TOP()) = Parser.parsebuiltin(fileModelicaCF,"UTF-8","",NONE(),acceptedGram=Flags.METAMODELICA);
391-
Absyn.PROGRAM(classes=classes2,within_=Absyn.TOP()) = Parser.parsebuiltin(fileMetaModelica,"UTF-8","",NONE(),acceptedGram=Flags.METAMODELICA);
392-
classesNF = listAppend(classes1NF,classes2);
393-
classesCF = listAppend(classes1CF,classes2);
394-
pNF = Absyn.PROGRAM(classesNF,Absyn.TOP());
395-
pCF = Absyn.PROGRAM(classesCF,Absyn.TOP());
396-
(pNF as Absyn.PROGRAM(classes=classesNF)) = MetaUtil.createMetaClassesInProgram(pNF);
397-
(pCF as Absyn.PROGRAM(classes=classesCF)) = MetaUtil.createMetaClassesInProgram(pCF);
398-
spNF = List.map(classesNF, AbsynToSCode.translateClass);
399-
spCF = List.map(classesCF, AbsynToSCode.translateClass);
400-
assocLst = getGlobalRoot(Global.builtinIndex);
395+
pNF := Parser.parsebuiltin(fileModelicaNF, "UTF-8", "", NONE(), acceptedGram = Flags.METAMODELICA);
396+
pCF := Parser.parsebuiltin(fileModelicaCF, "UTF-8", "", NONE(), acceptedGram = Flags.METAMODELICA);
397+
pMM := Parser.parsebuiltin(fileMetaModelica, "UTF-8", "", NONE(), acceptedGram = Flags.METAMODELICA);
398+
pNF := mergePrograms(pNF, pMM);
399+
pCF := mergePrograms(pCF, pMM);
400+
pNF := MetaUtil.createMetaClassesInProgram(pNF);
401+
pCF := MetaUtil.createMetaClassesInProgram(pCF);
402+
spNF := list(AbsynToSCode.translateClass(c) for c in pNF.classes);
403+
spCF := list(AbsynToSCode.translateClass(c) for c in pCF.classes);
404+
assocLst := getGlobalRoot(Global.builtinIndex);
401405
setGlobalRoot(Global.builtinIndex, ((Flags.METAMODELICA, true), (pNF,spNF))::((Flags.METAMODELICA, false), (pCF,spCF))::assocLst);
402-
(p, sp) = if Flags.isSet(Flags.SCODE_INST) then (pNF, spNF) else (pCF, spCF);
406+
(p, sp) := if Flags.isSet(Flags.SCODE_INST) then (pNF, spNF) else (pCF, spCF);
403407
then (p,sp);
404408
case ()
405-
equation
406-
true = intEq(Flags.getConfigEnum(Flags.GRAMMAR), Flags.PARMODELICA);
409+
algorithm
410+
true := intEq(Flags.getConfigEnum(Flags.GRAMMAR), Flags.PARMODELICA);
407411
Error.assertionOrAddSourceMessage(System.regularFileExists(fileModelicaNF),Error.FILE_NOT_FOUND_ERROR,{fileModelicaNF},AbsynUtil.dummyInfo);
408412
Error.assertionOrAddSourceMessage(System.regularFileExists(fileModelicaCF),Error.FILE_NOT_FOUND_ERROR,{fileModelicaCF},AbsynUtil.dummyInfo);
409413
Error.assertionOrAddSourceMessage(System.regularFileExists(fileMetaModelica),Error.FILE_NOT_FOUND_ERROR,{fileMetaModelica},AbsynUtil.dummyInfo);
410-
Absyn.PROGRAM(classes=classes1NF,within_=Absyn.TOP()) = Parser.parsebuiltin(fileModelicaNF,"UTF-8","",NONE(),acceptedGram=Flags.METAMODELICA);
411-
Absyn.PROGRAM(classes=classes1CF,within_=Absyn.TOP()) = Parser.parsebuiltin(fileModelicaCF,"UTF-8","",NONE(),acceptedGram=Flags.METAMODELICA);
412-
Absyn.PROGRAM(classes=classes2,within_=Absyn.TOP()) = Parser.parsebuiltin(fileParModelica,"UTF-8","",NONE(),acceptedGram=Flags.METAMODELICA);
413-
classesNF = listAppend(classes1NF,classes2);
414-
classesCF = listAppend(classes1CF,classes2);
415-
pNF = Absyn.PROGRAM(classesNF,Absyn.TOP());
416-
pCF = Absyn.PROGRAM(classesCF,Absyn.TOP());
417-
spNF = List.map(classesNF, AbsynToSCode.translateClass);
418-
spCF = List.map(classesCF, AbsynToSCode.translateClass);
419-
assocLst = getGlobalRoot(Global.builtinIndex);
414+
pNF := Parser.parsebuiltin(fileModelicaNF, "UTF-8", "", NONE(), acceptedGram = Flags.METAMODELICA);
415+
pCF := Parser.parsebuiltin(fileModelicaCF, "UTF-8", "", NONE(), acceptedGram = Flags.METAMODELICA);
416+
pMM := Parser.parsebuiltin(fileParModelica, "UTF-8", "", NONE(), acceptedGram = Flags.METAMODELICA);
417+
pNF := mergePrograms(pNF, pMM);
418+
pCF := mergePrograms(pCF, pMM);
419+
spNF := list(AbsynToSCode.translateClass(c) for c in pNF.classes);
420+
spCF := list(AbsynToSCode.translateClass(c) for c in pCF.classes);
421+
assocLst := getGlobalRoot(Global.builtinIndex);
420422
setGlobalRoot(Global.builtinIndex, ((Flags.PARMODELICA, true), (pNF,spNF))::((Flags.PARMODELICA, false), (pCF,spCF))::assocLst);
421-
(p, sp) = if Flags.isSet(Flags.SCODE_INST) then (pNF, spNF) else (pCF, spCF);
423+
(p, sp) := if Flags.isSet(Flags.SCODE_INST) then (pNF, spNF) else (pCF, spCF);
422424
then (p,sp);
423425
case ()
424-
equation
425-
true = intEq(Flags.getConfigEnum(Flags.GRAMMAR), Flags.MODELICA) or intEq(Flags.getConfigEnum(Flags.GRAMMAR), Flags.OPTIMICA);
426+
algorithm
427+
true := intEq(Flags.getConfigEnum(Flags.GRAMMAR), Flags.MODELICA) or intEq(Flags.getConfigEnum(Flags.GRAMMAR), Flags.OPTIMICA);
426428
Error.assertionOrAddSourceMessage(System.regularFileExists(fileModelicaNF),Error.FILE_NOT_FOUND_ERROR,{fileModelicaNF},AbsynUtil.dummyInfo);
427429
Error.assertionOrAddSourceMessage(System.regularFileExists(fileModelicaCF),Error.FILE_NOT_FOUND_ERROR,{fileModelicaCF},AbsynUtil.dummyInfo);
428-
(pNF as Absyn.PROGRAM(classes=classes1NF,within_=Absyn.TOP())) = Parser.parsebuiltin(fileModelicaNF,"UTF-8","",NONE(),acceptedGram=Flags.METAMODELICA);
429-
(pCF as Absyn.PROGRAM(classes=classes1CF,within_=Absyn.TOP())) = Parser.parsebuiltin(fileModelicaCF,"UTF-8","",NONE(),acceptedGram=Flags.METAMODELICA);
430-
spNF = List.map(classes1NF, AbsynToSCode.translateClass);
431-
spCF = List.map(classes1CF, AbsynToSCode.translateClass);
432-
assocLst = getGlobalRoot(Global.builtinIndex);
430+
pNF := Parser.parsebuiltin(fileModelicaNF, "UTF-8", "", NONE(), acceptedGram = Flags.METAMODELICA);
431+
pCF := Parser.parsebuiltin(fileModelicaCF, "UTF-8", "", NONE(), acceptedGram = Flags.METAMODELICA);
432+
spNF := list(AbsynToSCode.translateClass(c) for c in pNF.classes);
433+
spCF := list(AbsynToSCode.translateClass(c) for c in pCF.classes);
434+
assocLst := getGlobalRoot(Global.builtinIndex);
433435
setGlobalRoot(Global.builtinIndex, ((Flags.MODELICA, true), (pNF,spNF))::((Flags.MODELICA, false), (pCF,spCF))::assocLst);
434-
(p, sp) = if Flags.isSet(Flags.SCODE_INST) then (pNF, spNF) else (pCF, spCF);
436+
(p, sp) := if Flags.isSet(Flags.SCODE_INST) then (pNF, spNF) else (pCF, spCF);
435437
then (p,sp);
436438
case ()
437-
equation
438-
true = intEq(Flags.getConfigEnum(Flags.GRAMMAR), Flags.PDEMODELICA);
439+
algorithm
440+
true := intEq(Flags.getConfigEnum(Flags.GRAMMAR), Flags.PDEMODELICA);
439441
Error.assertionOrAddSourceMessage(System.regularFileExists(fileModelicaNF),Error.FILE_NOT_FOUND_ERROR,{fileModelicaNF},AbsynUtil.dummyInfo);
440442
Error.assertionOrAddSourceMessage(System.regularFileExists(fileModelicaCF),Error.FILE_NOT_FOUND_ERROR,{fileModelicaCF},AbsynUtil.dummyInfo);
441443
Error.assertionOrAddSourceMessage(System.regularFileExists(filePDEModelica),Error.FILE_NOT_FOUND_ERROR,{filePDEModelica},AbsynUtil.dummyInfo);
442-
Absyn.PROGRAM(classes=classes1NF,within_=Absyn.TOP()) = Parser.parsebuiltin(fileModelicaNF,"UTF-8","",NONE(),acceptedGram=Flags.METAMODELICA);
443-
Absyn.PROGRAM(classes=classes1CF,within_=Absyn.TOP()) = Parser.parsebuiltin(fileModelicaCF,"UTF-8","",NONE(),acceptedGram=Flags.METAMODELICA);
444-
Absyn.PROGRAM(classes=classes2,within_=Absyn.TOP()) = Parser.parsebuiltin(filePDEModelica,"UTF-8","",NONE(),acceptedGram=Flags.METAMODELICA);
445-
classesNF = listAppend(classes1NF,classes2);
446-
classesCF = listAppend(classes1CF,classes2);
447-
pNF = Absyn.PROGRAM(classesNF,Absyn.TOP());
448-
pCF = Absyn.PROGRAM(classesCF,Absyn.TOP());
449-
spNF = List.map(classesNF, AbsynToSCode.translateClass);
450-
spCF = List.map(classesCF, AbsynToSCode.translateClass);
451-
assocLst = getGlobalRoot(Global.builtinIndex);
444+
pNF := Parser.parsebuiltin(fileModelicaNF, "UTF-8", "", NONE(), acceptedGram = Flags.METAMODELICA);
445+
pCF := Parser.parsebuiltin(fileModelicaCF, "UTF-8", "", NONE(), acceptedGram = Flags.METAMODELICA);
446+
pMM := Parser.parsebuiltin(filePDEModelica, "UTF-8", "", NONE(), acceptedGram = Flags.METAMODELICA);
447+
pNF := mergePrograms(pNF, pMM);
448+
pCF := mergePrograms(pCF, pMM);
449+
spNF := list(AbsynToSCode.translateClass(c) for c in pNF.classes);
450+
spCF := list(AbsynToSCode.translateClass(c) for c in pCF.classes);
451+
assocLst := getGlobalRoot(Global.builtinIndex);
452452
setGlobalRoot(Global.builtinIndex, ((Flags.PDEMODELICA, true), (pNF,spNF))::((Flags.PDEMODELICA, false), (pCF,spCF))::assocLst);
453-
(p, sp) = if Flags.isSet(Flags.SCODE_INST) then (pNF, spNF) else (pCF, spCF);
453+
(p, sp) := if Flags.isSet(Flags.SCODE_INST) then (pNF, spNF) else (pCF, spCF);
454454
then (p,sp);
455455

456456
else

OMCompiler/Compiler/FrontEnd/AbsynUtil.mo

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6891,5 +6891,13 @@ function enumLiteralName
68916891
output String name = literal.literal;
68926892
end enumLiteralName;
68936893

6894+
public function elementItemClass
6895+
input Absyn.ElementItem item;
6896+
output Absyn.Class cls;
6897+
algorithm
6898+
Absyn.ElementItem.ELEMENTITEM(element = Absyn.Element.ELEMENT(specification =
6899+
Absyn.ElementSpec.CLASSDEF(class_ = cls))) := item;
6900+
end elementItemClass;
6901+
68946902
annotation(__OpenModelica_Interface="frontend");
68956903
end AbsynUtil;

0 commit comments

Comments
 (0)