@@ -1308,6 +1308,14 @@ function extractModUnit(modLoc: u64, exprVisitor: WasmExprVisitor): u32 {
13081308 return extractModAttr ( modLoc , "unit" , exprVisitor ) ;
13091309}
13101310
1311+ function extractModStart ( modLoc : u64 , exprVisitor : WasmExprVisitor ) : u32 {
1312+ return extractModAttr ( modLoc , "start" , exprVisitor ) ;
1313+ }
1314+
1315+ function extractModFixed ( modLoc : u64 , exprVisitor : WasmExprVisitor ) : u32 {
1316+ return extractModAttr ( modLoc , "fixed" , exprVisitor ) ;
1317+ }
1318+
13111319
13121320
13131321const MOD_ENTRY_SLOTS : u32 = 256 ;
@@ -4280,11 +4288,15 @@ export class ModelicaFlattener {
42804288 }
42814289
42824290 let declModLoc = findClassModificationLoc ( modLoc ) ;
4291+ let declStartId : u32 = 0xffffffff ;
4292+ let declFixedId : u32 = 0xffffffff ;
42834293 if ( ! locIsNull ( declModLoc ) ) {
42844294 let declUnitId = extractModUnit ( declModLoc , this . exprVisitor ) ;
42854295 if ( declUnitId != 0xffffffff ) {
42864296 subtypeUnitId = declUnitId ;
42874297 }
4298+ declStartId = extractModStart ( declModLoc , this . exprVisitor ) ;
4299+ declFixedId = extractModFixed ( declModLoc , this . exprVisitor ) ;
42884300 }
42894301
42904302 if ( this . scopeStackPtr != 0 ) {
@@ -4360,7 +4372,14 @@ export class ModelicaFlattener {
43604372 }
43614373
43624374 let startVal : f64 = 0.0 ;
4363- if ( valExprId != 0xffffffff ) {
4375+ if ( declStartId != 0xffffffff ) {
4376+ let expr = ExprAccessor . at ( this . dae . getExprData ( ) , declStartId ) ;
4377+ if ( expr . kind == ExprKind . RealLiteral ) {
4378+ startVal = expr . realValue ;
4379+ } else if ( expr . kind == ExprKind . IntLiteral ) {
4380+ startVal = expr . intValue as f64 ;
4381+ }
4382+ } else if ( valExprId != 0xffffffff ) {
43644383 let expr = ExprAccessor . at ( this . dae . getExprData ( ) , valExprId ) ;
43654384 if ( expr . kind == ExprKind . RealLiteral ) {
43664385 startVal = expr . realValue ;
@@ -4401,9 +4420,14 @@ export class ModelicaFlattener {
44014420 }
44024421 }
44034422 let elemVarIdx = this . dae . addVariable ( elemNameId , varType , variability , effectiveCausality , elemStartVal , varFlags ) ;
4404- if ( elemExprId != 0xffffffff && isParamOrConst ) {
4423+ if ( declStartId != 0xffffffff ) {
4424+ this . dae . setVarAttrExpr ( elemVarIdx , VarAttrKind . Start as u32 , declStartId ) ;
4425+ } else if ( elemExprId != 0xffffffff && isParamOrConst ) {
44054426 this . dae . setVarAttrExpr ( elemVarIdx , VarAttrKind . Start as u32 , elemExprId ) ;
44064427 }
4428+ if ( declFixedId != 0xffffffff ) {
4429+ this . dae . setVarAttrExpr ( elemVarIdx , VarAttrKind . Fixed as u32 , declFixedId ) ;
4430+ }
44074431 if ( subtypeUnitId != 0xffffffff ) {
44084432 this . dae . setVarAttrExpr ( elemVarIdx , VarAttrKind . Unit as u32 , subtypeUnitId ) ;
44094433 }
@@ -4434,9 +4458,14 @@ export class ModelicaFlattener {
44344458 }
44354459 }
44364460 let elemVarIdx = this . dae . addVariable ( elemNameId , varType , variability , effectiveCausality , elemStartVal , varFlags ) ;
4437- if ( elemExprId != 0xffffffff && isParamOrConst ) {
4461+ if ( declStartId != 0xffffffff ) {
4462+ this . dae . setVarAttrExpr ( elemVarIdx , VarAttrKind . Start as u32 , declStartId ) ;
4463+ } else if ( elemExprId != 0xffffffff && isParamOrConst ) {
44384464 this . dae . setVarAttrExpr ( elemVarIdx , VarAttrKind . Start as u32 , elemExprId ) ;
44394465 }
4466+ if ( declFixedId != 0xffffffff ) {
4467+ this . dae . setVarAttrExpr ( elemVarIdx , VarAttrKind . Fixed as u32 , declFixedId ) ;
4468+ }
44404469 if ( subtypeUnitId != 0xffffffff ) {
44414470 this . dae . setVarAttrExpr ( elemVarIdx , VarAttrKind . Unit as u32 , subtypeUnitId ) ;
44424471 }
@@ -4474,9 +4503,14 @@ export class ModelicaFlattener {
44744503 }
44754504 }
44764505 let elemVarIdx = this . dae . addVariable ( elemNameId , varType , variability , effectiveCausality , elemStartVal , varFlags ) ;
4477- if ( elemExprId != 0xffffffff && isParamOrConst ) {
4506+ if ( declStartId != 0xffffffff ) {
4507+ this . dae . setVarAttrExpr ( elemVarIdx , VarAttrKind . Start as u32 , declStartId ) ;
4508+ } else if ( elemExprId != 0xffffffff && isParamOrConst ) {
44784509 this . dae . setVarAttrExpr ( elemVarIdx , VarAttrKind . Start as u32 , elemExprId ) ;
44794510 }
4511+ if ( declFixedId != 0xffffffff ) {
4512+ this . dae . setVarAttrExpr ( elemVarIdx , VarAttrKind . Fixed as u32 , declFixedId ) ;
4513+ }
44804514 if ( subtypeUnitId != 0xffffffff ) {
44814515 this . dae . setVarAttrExpr ( elemVarIdx , VarAttrKind . Unit as u32 , subtypeUnitId ) ;
44824516 }
@@ -4486,10 +4520,15 @@ export class ModelicaFlattener {
44864520 }
44874521 } else {
44884522 let isParamOrConst = variability == ( Variability . Parameter as i32 ) || variability == ( Variability . Constant as i32 ) ;
4489- let varIdx = this . dae . addVariable ( fullVarNameId , varType , variability , effectiveCausality , isParamOrConst ? startVal : 0.0 , varFlags ) ;
4490- if ( valExprId != 0xffffffff && isParamOrConst ) {
4523+ let varIdx = this . dae . addVariable ( fullVarNameId , varType , variability , effectiveCausality , ( isParamOrConst || declStartId != 0xffffffff ) ? startVal : 0.0 , varFlags ) ;
4524+ if ( declStartId != 0xffffffff ) {
4525+ this . dae . setVarAttrExpr ( varIdx , VarAttrKind . Start as u32 , declStartId ) ;
4526+ } else if ( valExprId != 0xffffffff && isParamOrConst ) {
44914527 this . dae . setVarAttrExpr ( varIdx , VarAttrKind . Start as u32 , valExprId ) ;
44924528 }
4529+ if ( declFixedId != 0xffffffff ) {
4530+ this . dae . setVarAttrExpr ( varIdx , VarAttrKind . Fixed as u32 , declFixedId ) ;
4531+ }
44934532 if ( subtypeUnitId != 0xffffffff ) {
44944533 this . dae . setVarAttrExpr ( varIdx , VarAttrKind . Unit as u32 , subtypeUnitId ) ;
44954534 }
0 commit comments