feat(core): sparse dependency kinds, cs event mode state machine, fmu… · modelscript/modelscript@a0bfa4a · GitHub
Skip to content

Commit a0bfa4a

Browse files
committed
feat(core): sparse dependency kinds, cs event mode state machine, fmu build metadata
1 parent daf9d9d commit a0bfa4a

4 files changed

Lines changed: 120 additions & 32 deletions

File tree

‎packages/core/src/compiler/modelica/fmi.ts‎

Lines changed: 36 additions & 14 deletions

‎packages/core/src/compiler/modelica/fmi3.ts‎

Lines changed: 32 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -543,14 +543,34 @@ function detectAliases3(dae: ModelicaDAE, variables: Fmi3Variable[]): Map<string
543543
return aliasMap;
544544
}
545545

546+
/** A single entry in the enriched dependency graph. */
547+
interface DepEntry3 {
548+
vr: number;
549+
kind: "dependent" | "constant" | "fixed" | "tunable";
550+
}
551+
552+
/** Map variable variability to FMI dependency kind. */
553+
function variabilityToDepKind(v: Fmi3Variability): DepEntry3["kind"] {
554+
switch (v) {
555+
case "constant":
556+
return "constant";
557+
case "fixed":
558+
return "fixed";
559+
case "tunable":
560+
return "tunable";
561+
default:
562+
return "dependent";
563+
}
564+
}
565+
546566
function computeDependencies3(
547567
dae: ModelicaDAE,
548568
variables: Fmi3Variable[],
549569
outputRefs: number[],
550570
derivativeRefs: number[],
551571
initialUnknownRefs: number[],
552-
): Map<number, number[]> {
553-
const deps = new Map<number, number[]>();
572+
): Map<number, DepEntry3[]> {
573+
const deps = new Map<number, DepEntry3[]>();
554574
const svByName = new Map<string, Fmi3Variable>();
555575
for (const sv of variables) svByName.set(sv.name, sv);
556576

@@ -572,17 +592,17 @@ function computeDependencies3(
572592
const rhsNames = equationDeps.get(sv.name);
573593
if (!rhsNames) continue;
574594

575-
const depRefs: number[] = [];
595+
const entries: DepEntry3[] = [];
576596
for (const name of rhsNames) {
577597
const depSv = svByName.get(name);
578598
if (depSv && depSv.valueReference !== ref) {
579-
depRefs.push(depSv.valueReference);
599+
entries.push({ vr: depSv.valueReference, kind: variabilityToDepKind(depSv.variability) });
580600
}
581601
}
582-
if (depRefs.length > 0) {
602+
if (entries.length > 0) {
583603
deps.set(
584604
ref,
585-
depRefs.sort((a, b) => a - b),
605+
entries.sort((a, b) => a.vr - b.vr),
586606
);
587607
}
588608
}
@@ -816,7 +836,7 @@ function generateModelDescriptionXml3(
816836
clockRefs: number[];
817837
fmuType: Fmi3TypeFlags;
818838
nEventIndicators: number;
819-
deps: Map<number, number[]>;
839+
deps: Map<number, DepEntry3[]>;
820840
aliasMap: Map<string, string>;
821841
enumTypes: Map<string, { name: string; description: string | null }[]>;
822842
terminals: Fmi3Terminal[];
@@ -1026,13 +1046,13 @@ function generateModelDescriptionXml3(
10261046
}
10271047

10281048
/** Format an Unknown/Output/ContinuousStateDerivative element. */
1029-
function formatUnknown3(elementName: string, ref: number, deps: Map<number, number[]>): string {
1030-
const depRefs = deps.get(ref);
1031-
if (!depRefs || depRefs.length === 0) {
1049+
function formatUnknown3(elementName: string, ref: number, deps: Map<number, DepEntry3[]>): string {
1050+
const entries = deps.get(ref);
1051+
if (!entries || entries.length === 0) {
10321052
return ` <${elementName} valueReference="${ref}" />`;
10331053
}
1034-
const depsAttr = ` dependencies="${depRefs.join(" ")}"`;
1035-
const kindsAttr = ` dependenciesKind="${depRefs.map(() => "dependent").join(" ")}"`;
1054+
const depsAttr = ` dependencies="${entries.map((e) => e.vr).join(" ")}"`;
1055+
const kindsAttr = ` dependenciesKind="${entries.map((e) => e.kind).join(" ")}"`;
10361056
return ` <${elementName} valueReference="${ref}"${depsAttr}${kindsAttr} />`;
10371057
}
10381058

‎packages/core/src/compiler/modelica/fmu-archive.ts‎

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,19 @@ export function buildFmuArchive(
9595
}
9696
}
9797

98+
// ── buildDescription.xml (FMI 3.0 §2.5) ──
99+
const buildDescLines = [
100+
'<?xml version="1.0" encoding="UTF-8"?>',
101+
'<fmiBuildDescription fmiVersion="3.0">',
102+
` <BuildConfiguration modelIdentifier="${id}">`,
103+
' <SourceFileSet language="C">',
104+
` <SourceFile name="${id}_model.c" />`,
105+
" </SourceFileSet>",
106+
" </BuildConfiguration>",
107+
"</fmiBuildDescription>",
108+
];
109+
files.set("extra/buildDescription.xml", encoder.encode(buildDescLines.join("\n")));
110+
98111
// ── Build ZIP archive ──
99112
const archive = createZip(files);
100113

‎packages/core/src/compiler/modelica/fmu3-codegen.ts‎

Lines changed: 39 additions & 6 deletions

0 commit comments

Comments
 (0)