pub const DERIVATIVE_PREFIX: &str = "der_";
pub const PREVIOUS_VALUE_PREFIX: &str = "pre_";
pub const CONDITION_PREFIX: &str = "c";
pub const BUILTIN_DER: &str = "der";
pub const BUILTIN_PRE: &str = "pre";
pub const BUILTIN_REINIT: &str = "reinit";
pub const BUILTIN_TIME: &str = "time";
pub const BUILTIN_NO_EVENT: &str = "noEvent";
pub const BUILTIN_SMOOTH: &str = "smooth";
pub const BUILTIN_SAMPLE: &str = "sample";
pub const BUILTIN_EDGE: &str = "edge";
pub const BUILTIN_CHANGE: &str = "change";
pub const BUILTIN_INITIAL: &str = "initial";
pub const BUILTIN_TERMINAL: &str = "terminal";
pub const BUILTIN_SIN: &str = "sin";
pub const BUILTIN_COS: &str = "cos";
pub const BUILTIN_TAN: &str = "tan";
pub const BUILTIN_ASIN: &str = "asin";
pub const BUILTIN_ACOS: &str = "acos";
pub const BUILTIN_ATAN: &str = "atan";
pub const BUILTIN_ATAN2: &str = "atan2";
pub const BUILTIN_SINH: &str = "sinh";
pub const BUILTIN_COSH: &str = "cosh";
pub const BUILTIN_TANH: &str = "tanh";
pub const BUILTIN_EXP: &str = "exp";
pub const BUILTIN_LOG: &str = "log";
pub const BUILTIN_LOG10: &str = "log10";
pub const BUILTIN_SQRT: &str = "sqrt";
pub const BUILTIN_ABS: &str = "abs";
pub const BUILTIN_SIGN: &str = "sign";
pub const BUILTIN_FLOOR: &str = "floor";
pub const BUILTIN_CEIL: &str = "ceil";
pub const BUILTIN_MOD: &str = "mod";
pub const BUILTIN_REM: &str = "rem";
pub const BUILTIN_MIN: &str = "min";
pub const BUILTIN_MAX: &str = "max";
pub const BUILTIN_INTEGER: &str = "integer";
pub const BUILTIN_INTEGER_TYPE: &str = "Integer"; pub const BUILTIN_DIV: &str = "div";
pub const BUILTIN_ZEROS: &str = "zeros";
pub const BUILTIN_ONES: &str = "ones";
pub const BUILTIN_FILL: &str = "fill";
pub const BUILTIN_IDENTITY: &str = "identity";
pub const BUILTIN_DIAGONAL: &str = "diagonal";
pub const BUILTIN_LINSPACE: &str = "linspace";
pub const BUILTIN_SIZE: &str = "size";
pub const BUILTIN_NDIMS: &str = "ndims";
pub const BUILTIN_SUM: &str = "sum";
pub const BUILTIN_PRODUCT: &str = "product";
pub const BUILTIN_TRANSPOSE: &str = "transpose";
pub const BUILTIN_SYMMETRIC: &str = "symmetric";
pub const BUILTIN_CROSS: &str = "cross";
pub const BUILTIN_SKEW: &str = "skew";
pub const BUILTIN_OUTER_PRODUCT: &str = "outerProduct";
pub const BUILTIN_SCALAR: &str = "scalar";
pub const BUILTIN_VECTOR: &str = "vector";
pub const BUILTIN_MATRIX: &str = "matrix";
pub const BUILTIN_CARDINALITY: &str = "cardinality";
pub const BUILTIN_SEMI_LINEAR: &str = "semiLinear";
pub const BUILTIN_STRING: &str = "String";
pub const BUILTIN_DELAY: &str = "delay";
pub const BUILTIN_SPATIAL_DISTRIBUTION: &str = "spatialDistribution";
pub const BUILTIN_GET_INSTANCE_NAME: &str = "getInstanceName";
pub const BUILTIN_HOMOTOPY: &str = "homotopy";
pub const BUILTIN_ASSERT: &str = "assert";
pub const BUILTIN_TERMINATE: &str = "terminate";
pub const TYPE_REAL: &str = "Real";
pub const TYPE_BOOL: &str = "Bool";
pub const TYPE_INTEGER: &str = "Integer";
pub const TYPE_STRING: &str = "String";
pub const MODELICA_PI: f64 = std::f64::consts::PI;
pub const MODELICA_E: f64 = std::f64::consts::E;
pub const MODELICA_D2R: f64 = std::f64::consts::PI / 180.0;
pub const MODELICA_R2D: f64 = 180.0 / std::f64::consts::PI;
pub const MODELICA_GAMMA: f64 = 0.577_215_664_901_532_9;
pub const MODELICA_EPS: f64 = f64::EPSILON;
pub const MODELICA_SMALL: f64 = f64::MIN_POSITIVE;
pub const MODELICA_INF: f64 = f64::MAX;
pub const MODELICA_C: f64 = 299792458.0;
pub const MODELICA_G_N: f64 = 9.80665;
pub const MODELICA_G: f64 = 6.67430e-11;
pub const MODELICA_Q: f64 = 1.602176634e-19;
pub const MODELICA_H: f64 = 6.62607015e-34;
pub const MODELICA_K: f64 = 1.380649e-23;
pub const MODELICA_N_A: f64 = 6.02214076e23;
pub const MODELICA_F: f64 = MODELICA_Q * MODELICA_N_A;
pub const MODELICA_R: f64 = MODELICA_K * MODELICA_N_A;
pub const MODELICA_MU_0: f64 = 1.25663706212e-6;
pub const MODELICA_EPSILON_0: f64 = 1.0 / (MODELICA_MU_0 * MODELICA_C * MODELICA_C);
pub const MODELICA_SIGMA: f64 = 5.670374419e-8;
pub const MODELICA_T_ZERO: f64 = -273.15;
pub fn get_modelica_constant(name: &str) -> Option<f64> {
let short_name = name.strip_prefix("Modelica.Constants.").unwrap_or(name);
match short_name {
"pi" => Some(MODELICA_PI),
"e" => Some(MODELICA_E),
"D2R" => Some(MODELICA_D2R),
"R2D" => Some(MODELICA_R2D),
"gamma" => Some(MODELICA_GAMMA),
"eps" => Some(MODELICA_EPS),
"small" => Some(MODELICA_SMALL),
"inf" => Some(MODELICA_INF),
"c" => Some(MODELICA_C),
"g_n" => Some(MODELICA_G_N),
"G" => Some(MODELICA_G),
"q" => Some(MODELICA_Q),
"h" => Some(MODELICA_H),
"k" => Some(MODELICA_K),
"N_A" => Some(MODELICA_N_A),
"F" => Some(MODELICA_F),
"R" => Some(MODELICA_R),
"mu_0" => Some(MODELICA_MU_0),
"epsilon_0" => Some(MODELICA_EPSILON_0),
"sigma" => Some(MODELICA_SIGMA),
"T_zero" => Some(MODELICA_T_ZERO),
_ => None,
}
}
pub fn modelica_constant_names() -> Vec<String> {
vec![
"pi".to_string(),
"mu_0".to_string(),
"epsilon_0".to_string(),
"sigma".to_string(),
"g_n".to_string(),
"N_A".to_string(),
"D2R".to_string(),
"R2D".to_string(),
"gamma".to_string(),
"eps".to_string(),
"small".to_string(),
"inf".to_string(),
"T_zero".to_string(),
]
}
pub fn all_modelica_constant_names() -> Vec<String> {
vec![
"pi".to_string(),
"mu_0".to_string(),
"epsilon_0".to_string(),
"sigma".to_string(),
"g_n".to_string(),
"N_A".to_string(),
"D2R".to_string(),
"R2D".to_string(),
"gamma".to_string(),
"eps".to_string(),
"small".to_string(),
"inf".to_string(),
"T_zero".to_string(),
"e".to_string(),
"c".to_string(),
"G".to_string(),
"q".to_string(),
"h".to_string(),
"k".to_string(),
"F".to_string(),
"R".to_string(),
]
}
#[derive(Debug, Clone)]
pub struct BuiltinFunction {
pub name: &'static str,
pub signature: &'static str,
pub documentation: &'static str,
pub parameters: &'static [(&'static str, &'static str)],
}
pub static BUILTIN_FUNCTIONS: &[BuiltinFunction] = &[
BuiltinFunction {
name: "der",
signature: "der(x: Real) -> Real",
documentation: "Time derivative of the argument. Only allowed for continuous-time expressions.",
parameters: &[("x", "Real expression to differentiate with respect to time")],
},
BuiltinFunction {
name: "pre",
signature: "pre(x) -> type(x)",
documentation: "Returns the value of x at the previous event instant. Can only be used in when-equations/algorithms.",
parameters: &[("x", "Variable to get previous value of")],
},
BuiltinFunction {
name: "reinit",
signature: "reinit(x: Real, expr: Real)",
documentation: "Reinitializes x with expr at an event instant. Can only be used in when-equations.",
parameters: &[
("x", "State variable to reinitialize"),
("expr", "New value for the state variable"),
],
},
BuiltinFunction {
name: "noEvent",
signature: "noEvent(expr) -> type(expr)",
documentation: "Suppresses event generation for the expression. Use with care.",
parameters: &[("expr", "Expression to evaluate without event generation")],
},
BuiltinFunction {
name: "smooth",
signature: "smooth(p: Integer, expr: Real) -> Real",
documentation: "Indicates that expr is p times continuously differentiable.",
parameters: &[
("p", "Order of continuous differentiability"),
("expr", "Expression that is smooth to order p"),
],
},
BuiltinFunction {
name: "sample",
signature: "sample(start: Real, interval: Real) -> Boolean",
documentation: "Returns true at time instants start + i*interval (i=0,1,2,...).",
parameters: &[
("start", "Time of first sample"),
("interval", "Sample interval"),
],
},
BuiltinFunction {
name: "edge",
signature: "edge(b: Boolean) -> Boolean",
documentation: "Returns true at the instant when b becomes true (rising edge).",
parameters: &[("b", "Boolean expression to detect rising edge")],
},
BuiltinFunction {
name: "change",
signature: "change(v) -> Boolean",
documentation: "Returns true when the value of v changes.",
parameters: &[("v", "Variable to monitor for changes")],
},
BuiltinFunction {
name: "initial",
signature: "initial() -> Boolean",
documentation: "Returns true during initialization, false during simulation.",
parameters: &[],
},
BuiltinFunction {
name: "terminal",
signature: "terminal() -> Boolean",
documentation: "Returns true at the end of a successful simulation.",
parameters: &[],
},
BuiltinFunction {
name: "sin",
signature: "sin(x: Real) -> Real",
documentation: "Sine of x (x in radians).",
parameters: &[("x", "Angle in radians")],
},
BuiltinFunction {
name: "cos",
signature: "cos(x: Real) -> Real",
documentation: "Cosine of x (x in radians).",
parameters: &[("x", "Angle in radians")],
},
BuiltinFunction {
name: "tan",
signature: "tan(x: Real) -> Real",
documentation: "Tangent of x (x in radians).",
parameters: &[("x", "Angle in radians")],
},
BuiltinFunction {
name: "asin",
signature: "asin(x: Real) -> Real",
documentation: "Inverse sine (arcsine) of x. Result in radians.",
parameters: &[("x", "Value in range [-1, 1]")],
},
BuiltinFunction {
name: "acos",
signature: "acos(x: Real) -> Real",
documentation: "Inverse cosine (arccosine) of x. Result in radians.",
parameters: &[("x", "Value in range [-1, 1]")],
},
BuiltinFunction {
name: "atan",
signature: "atan(x: Real) -> Real",
documentation: "Inverse tangent (arctangent) of x. Result in radians.",
parameters: &[("x", "Real value")],
},
BuiltinFunction {
name: "atan2",
signature: "atan2(y: Real, x: Real) -> Real",
documentation: "Two-argument arctangent. Returns angle in radians between -π and π.",
parameters: &[("y", "Y coordinate"), ("x", "X coordinate")],
},
BuiltinFunction {
name: "sinh",
signature: "sinh(x: Real) -> Real",
documentation: "Hyperbolic sine of x.",
parameters: &[("x", "Real value")],
},
BuiltinFunction {
name: "cosh",
signature: "cosh(x: Real) -> Real",
documentation: "Hyperbolic cosine of x.",
parameters: &[("x", "Real value")],
},
BuiltinFunction {
name: "tanh",
signature: "tanh(x: Real) -> Real",
documentation: "Hyperbolic tangent of x.",
parameters: &[("x", "Real value")],
},
BuiltinFunction {
name: "exp",
signature: "exp(x: Real) -> Real",
documentation: "Exponential function e^x.",
parameters: &[("x", "Exponent")],
},
BuiltinFunction {
name: "log",
signature: "log(x: Real) -> Real",
documentation: "Natural logarithm (base e) of x.",
parameters: &[("x", "Positive real value")],
},
BuiltinFunction {
name: "log10",
signature: "log10(x: Real) -> Real",
documentation: "Base-10 logarithm of x.",
parameters: &[("x", "Positive real value")],
},
BuiltinFunction {
name: "sqrt",
signature: "sqrt(x: Real) -> Real",
documentation: "Square root of x.",
parameters: &[("x", "Non-negative real value")],
},
BuiltinFunction {
name: "abs",
signature: "abs(x) -> type(x)",
documentation: "Absolute value of x.",
parameters: &[("x", "Numeric value")],
},
BuiltinFunction {
name: "sign",
signature: "sign(x: Real) -> Integer",
documentation: "Sign of x: -1, 0, or 1.",
parameters: &[("x", "Real value")],
},
BuiltinFunction {
name: "floor",
signature: "floor(x: Real) -> Real",
documentation: "Largest integer not greater than x, returned as Real.",
parameters: &[("x", "Real value")],
},
BuiltinFunction {
name: "ceil",
signature: "ceil(x: Real) -> Real",
documentation: "Smallest integer not less than x, returned as Real.",
parameters: &[("x", "Real value")],
},
BuiltinFunction {
name: "mod",
signature: "mod(x: Real, y: Real) -> Real",
documentation: "Modulo: x - floor(x/y)*y. Result has same sign as y.",
parameters: &[("x", "Dividend"), ("y", "Divisor")],
},
BuiltinFunction {
name: "rem",
signature: "rem(x: Real, y: Real) -> Real",
documentation: "Remainder: x - div(x,y)*y. Result has same sign as x.",
parameters: &[("x", "Dividend"), ("y", "Divisor")],
},
BuiltinFunction {
name: "min",
signature: "min(x, y) -> type(x)",
documentation: "Returns the smaller of x and y. Can also be applied to arrays.",
parameters: &[
("x", "First value or array"),
("y", "Second value (optional for arrays)"),
],
},
BuiltinFunction {
name: "max",
signature: "max(x, y) -> type(x)",
documentation: "Returns the larger of x and y. Can also be applied to arrays.",
parameters: &[
("x", "First value or array"),
("y", "Second value (optional for arrays)"),
],
},
BuiltinFunction {
name: "integer",
signature: "integer(x: Real) -> Integer",
documentation: "Converts Real to Integer by truncation toward negative infinity.",
parameters: &[("x", "Real value to convert")],
},
BuiltinFunction {
name: "div",
signature: "div(x: Real, y: Real) -> Integer",
documentation: "Integer division: algebraic quotient with fractional part discarded.",
parameters: &[("x", "Dividend"), ("y", "Divisor")],
},
BuiltinFunction {
name: "zeros",
signature: "zeros(n1, n2, ...) -> Real[n1, n2, ...]",
documentation: "Creates an array of zeros with given dimensions.",
parameters: &[("n1, n2, ...", "Dimensions of the array")],
},
BuiltinFunction {
name: "ones",
signature: "ones(n1, n2, ...) -> Real[n1, n2, ...]",
documentation: "Creates an array of ones with given dimensions.",
parameters: &[("n1, n2, ...", "Dimensions of the array")],
},
BuiltinFunction {
name: "fill",
signature: "fill(s, n1, n2, ...) -> type(s)[n1, n2, ...]",
documentation: "Creates an array filled with scalar value s.",
parameters: &[
("s", "Scalar value to fill with"),
("n1, n2, ...", "Dimensions of the array"),
],
},
BuiltinFunction {
name: "identity",
signature: "identity(n: Integer) -> Real[n, n]",
documentation: "Creates an n×n identity matrix.",
parameters: &[("n", "Size of the square matrix")],
},
BuiltinFunction {
name: "diagonal",
signature: "diagonal(v: Real[:]) -> Real[size(v,1), size(v,1)]",
documentation: "Creates a diagonal matrix from vector v.",
parameters: &[("v", "Vector of diagonal elements")],
},
BuiltinFunction {
name: "linspace",
signature: "linspace(x1: Real, x2: Real, n: Integer) -> Real[n]",
documentation: "Creates a vector of n equally spaced points from x1 to x2.",
parameters: &[
("x1", "Start value"),
("x2", "End value"),
("n", "Number of points"),
],
},
BuiltinFunction {
name: "size",
signature: "size(A, i) -> Integer",
documentation: "Returns size of dimension i of array A. Without i, returns size vector.",
parameters: &[("A", "Array"), ("i", "Dimension index (optional)")],
},
BuiltinFunction {
name: "ndims",
signature: "ndims(A) -> Integer",
documentation: "Returns number of dimensions of array A.",
parameters: &[("A", "Array")],
},
BuiltinFunction {
name: "sum",
signature: "sum(A) -> type(A[1,...])",
documentation: "Returns sum of all elements in array A.",
parameters: &[("A", "Array to sum")],
},
BuiltinFunction {
name: "product",
signature: "product(A) -> type(A[1,...])",
documentation: "Returns product of all elements in array A.",
parameters: &[("A", "Array to multiply")],
},
BuiltinFunction {
name: "transpose",
signature: "transpose(A: Real[:,:]) -> Real[size(A,2), size(A,1)]",
documentation: "Transposes a matrix.",
parameters: &[("A", "Matrix to transpose")],
},
BuiltinFunction {
name: "symmetric",
signature: "symmetric(A: Real[:,:]) -> Real[size(A,1), size(A,2)]",
documentation: "Returns symmetric matrix: upper triangle copied to lower.",
parameters: &[("A", "Square matrix")],
},
BuiltinFunction {
name: "cross",
signature: "cross(x: Real[3], y: Real[3]) -> Real[3]",
documentation: "Cross product of two 3-vectors.",
parameters: &[("x", "First 3-vector"), ("y", "Second 3-vector")],
},
BuiltinFunction {
name: "skew",
signature: "skew(x: Real[3]) -> Real[3, 3]",
documentation: "Skew-symmetric matrix from 3-vector. skew(x)*y = cross(x,y).",
parameters: &[("x", "3-vector")],
},
BuiltinFunction {
name: "outerProduct",
signature: "outerProduct(v1: Real[:], v2: Real[:]) -> Real[size(v1,1), size(v2,1)]",
documentation: "Outer product of two vectors: result[i,j] = v1[i]*v2[j].",
parameters: &[("v1", "First vector"), ("v2", "Second vector")],
},
BuiltinFunction {
name: "scalar",
signature: "scalar(A: Real[1] or Real[1,1]) -> Real",
documentation: "Converts a single-element array to a scalar.",
parameters: &[("A", "Single-element array")],
},
BuiltinFunction {
name: "vector",
signature: "vector(A) -> Real[:]",
documentation: "Converts array to vector (flattens to 1D).",
parameters: &[("A", "Array to convert")],
},
BuiltinFunction {
name: "matrix",
signature: "matrix(A) -> Real[:,:]",
documentation: "Converts array to matrix (2D).",
parameters: &[("A", "Array to convert")],
},
BuiltinFunction {
name: "cardinality",
signature: "cardinality(c: connector) -> Integer",
documentation: "Returns number of connections to connector c (deprecated).",
parameters: &[("c", "Connector")],
},
BuiltinFunction {
name: "semiLinear",
signature: "semiLinear(x: Real, k1: Real, k2: Real) -> Real",
documentation: "Piecewise linear: if x >= 0 then k1*x else k2*x.",
parameters: &[
("x", "Switching variable"),
("k1", "Slope for positive x"),
("k2", "Slope for negative x"),
],
},
BuiltinFunction {
name: "String",
signature: "String(x, ...) -> String",
documentation: "Converts value to string representation.",
parameters: &[
("x", "Value to convert"),
("format", "Optional format specifier"),
],
},
BuiltinFunction {
name: "delay",
signature: "delay(expr: Real, delayTime: Real, maxDelay: Real) -> Real",
documentation: "Time delay: returns expr(time - delayTime).",
parameters: &[
("expr", "Expression to delay"),
("delayTime", "Delay time"),
("maxDelay", "Maximum delay (optional)"),
],
},
BuiltinFunction {
name: "spatialDistribution",
signature: "spatialDistribution(in0, in1, x, positiveVelocity, ...) -> (out0, out1)",
documentation: "Transport delay for fluid flow with variable velocity.",
parameters: &[
("in0", "Input at position 0"),
("in1", "Input at position 1"),
("x", "Normalized position [0,1]"),
("positiveVelocity", "Direction of transport"),
],
},
BuiltinFunction {
name: "getInstanceName",
signature: "getInstanceName() -> String",
documentation: "Returns the instance name path of the model.",
parameters: &[],
},
BuiltinFunction {
name: "homotopy",
signature: "homotopy(actual: Real, simplified: Real) -> Real",
documentation: "Continuation method: returns actual in normal simulation, can use simplified for initialization.",
parameters: &[
("actual", "Expression used during simulation"),
("simplified", "Simplified expression for initialization"),
],
},
BuiltinFunction {
name: "assert",
signature: "assert(condition: Boolean, message: String, level: AssertionLevel)",
documentation: "Runtime assertion. Triggers error/warning if condition is false.",
parameters: &[
("condition", "Condition that must be true"),
("message", "Error message if condition fails"),
("level", "AssertionLevel.error or .warning (optional)"),
],
},
BuiltinFunction {
name: "terminate",
signature: "terminate(message: String)",
documentation: "Terminates simulation successfully with given message.",
parameters: &[("message", "Termination message")],
},
];
pub fn get_builtin_functions() -> &'static [BuiltinFunction] {
BUILTIN_FUNCTIONS
}
pub fn get_builtin_function(name: &str) -> Option<&'static BuiltinFunction> {
BUILTIN_FUNCTIONS.iter().find(|f| f.name == name)
}
pub fn derivative_name(var: &str) -> String {
format!("{}{}", DERIVATIVE_PREFIX, var)
}
pub fn previous_value_name(var: &str) -> String {
format!("{}{}", PREVIOUS_VALUE_PREFIX, var)
}
pub fn condition_name(index: usize) -> String {
format!("{}{}", CONDITION_PREFIX, index)
}
pub fn global_builtins() -> Vec<String> {
let mut builtins = vec![
BUILTIN_TIME.to_string(),
BUILTIN_DER.to_string(),
BUILTIN_PRE.to_string(),
BUILTIN_REINIT.to_string(),
BUILTIN_NO_EVENT.to_string(),
BUILTIN_SMOOTH.to_string(),
BUILTIN_SAMPLE.to_string(),
BUILTIN_EDGE.to_string(),
BUILTIN_CHANGE.to_string(),
BUILTIN_INITIAL.to_string(),
BUILTIN_TERMINAL.to_string(),
BUILTIN_SIN.to_string(),
BUILTIN_COS.to_string(),
BUILTIN_TAN.to_string(),
BUILTIN_ASIN.to_string(),
BUILTIN_ACOS.to_string(),
BUILTIN_ATAN.to_string(),
BUILTIN_ATAN2.to_string(),
BUILTIN_SINH.to_string(),
BUILTIN_COSH.to_string(),
BUILTIN_TANH.to_string(),
BUILTIN_EXP.to_string(),
BUILTIN_LOG.to_string(),
BUILTIN_LOG10.to_string(),
BUILTIN_SQRT.to_string(),
BUILTIN_ABS.to_string(),
BUILTIN_SIGN.to_string(),
BUILTIN_FLOOR.to_string(),
BUILTIN_CEIL.to_string(),
BUILTIN_MOD.to_string(),
BUILTIN_REM.to_string(),
BUILTIN_MIN.to_string(),
BUILTIN_MAX.to_string(),
BUILTIN_INTEGER.to_string(),
BUILTIN_INTEGER_TYPE.to_string(),
BUILTIN_DIV.to_string(),
BUILTIN_ZEROS.to_string(),
BUILTIN_ONES.to_string(),
BUILTIN_FILL.to_string(),
BUILTIN_IDENTITY.to_string(),
BUILTIN_DIAGONAL.to_string(),
BUILTIN_LINSPACE.to_string(),
BUILTIN_SIZE.to_string(),
BUILTIN_NDIMS.to_string(),
BUILTIN_SUM.to_string(),
BUILTIN_PRODUCT.to_string(),
BUILTIN_TRANSPOSE.to_string(),
BUILTIN_SYMMETRIC.to_string(),
BUILTIN_CROSS.to_string(),
BUILTIN_SKEW.to_string(),
BUILTIN_OUTER_PRODUCT.to_string(),
BUILTIN_SCALAR.to_string(),
BUILTIN_VECTOR.to_string(),
BUILTIN_MATRIX.to_string(),
BUILTIN_CARDINALITY.to_string(),
BUILTIN_SEMI_LINEAR.to_string(),
BUILTIN_STRING.to_string(),
BUILTIN_DELAY.to_string(),
BUILTIN_SPATIAL_DISTRIBUTION.to_string(),
BUILTIN_GET_INSTANCE_NAME.to_string(),
BUILTIN_HOMOTOPY.to_string(),
BUILTIN_ASSERT.to_string(),
BUILTIN_TERMINATE.to_string(),
];
for name in modelica_constant_names() {
builtins.push(name.clone());
}
for name in all_modelica_constant_names() {
builtins.push(format!("Modelica.Constants.{}", name));
}
for name in builtin_enumeration_names() {
builtins.push(name);
}
builtins
}
pub fn is_builtin_function(name: &str) -> bool {
global_builtins().contains(&name.to_string())
}
pub fn is_primitive_type(name: &str) -> bool {
matches!(
name,
TYPE_REAL
| TYPE_BOOL
| TYPE_INTEGER
| TYPE_STRING
| "Boolean"
| "StateSelect"
| "AssertionLevel"
| "ExternalObject"
| "Clock" )
}
pub mod state_select {
pub const NEVER: i64 = 1;
pub const AVOID: i64 = 2;
pub const DEFAULT: i64 = 3;
pub const PREFER: i64 = 4;
pub const ALWAYS: i64 = 5;
}
pub mod init {
pub const NO_INIT: i64 = 1;
pub const STEADY_STATE: i64 = 2;
pub const INITIAL_STATE: i64 = 3;
pub const INITIAL_OUTPUT: i64 = 4;
}
pub mod dynamics {
pub const DYNAMIC_FREE_INITIAL: i64 = 1;
pub const FIXED_INITIAL: i64 = 2;
pub const STEADY_STATE_INITIAL: i64 = 3;
pub const STEADY_STATE: i64 = 4;
}
pub mod gravity_types {
pub const NO_GRAVITY: i64 = 1;
pub const UNIFORM_GRAVITY: i64 = 2;
pub const POINT_GRAVITY: i64 = 3;
}
pub mod assertion_level {
pub const WARNING: i64 = 1;
pub const ERROR: i64 = 2;
}
pub mod analog_filter {
pub const CRITICAL_DAMPING: i64 = 1;
pub const BESSEL: i64 = 2;
pub const BUTTERWORTH: i64 = 3;
pub const CHEBYSHEV_I: i64 = 4;
}
pub mod filter_type {
pub const LOW_PASS: i64 = 1;
pub const HIGH_PASS: i64 = 2;
pub const BAND_PASS: i64 = 3;
pub const BAND_STOP: i64 = 4;
}
pub mod simple_controller {
pub const P: i64 = 1;
pub const PI: i64 = 2;
pub const PD: i64 = 3;
pub const PID: i64 = 4;
}
pub fn get_enumeration_value(name: &str) -> Option<i64> {
if name == "StateSelect.never" || name.ends_with(".StateSelect.never") {
return Some(state_select::NEVER);
}
if name == "StateSelect.avoid" || name.ends_with(".StateSelect.avoid") {
return Some(state_select::AVOID);
}
if name == "StateSelect.default" || name.ends_with(".StateSelect.default") {
return Some(state_select::DEFAULT);
}
if name == "StateSelect.prefer" || name.ends_with(".StateSelect.prefer") {
return Some(state_select::PREFER);
}
if name == "StateSelect.always" || name.ends_with(".StateSelect.always") {
return Some(state_select::ALWAYS);
}
if name == "Init.NoInit" || name.ends_with(".Init.NoInit") {
return Some(init::NO_INIT);
}
if name == "Init.SteadyState" || name.ends_with(".Init.SteadyState") {
return Some(init::STEADY_STATE);
}
if name == "Init.InitialState" || name.ends_with(".Init.InitialState") {
return Some(init::INITIAL_STATE);
}
if name == "Init.InitialOutput" || name.ends_with(".Init.InitialOutput") {
return Some(init::INITIAL_OUTPUT);
}
if name == "Dynamics.DynamicFreeInitial" || name.ends_with(".Dynamics.DynamicFreeInitial") {
return Some(dynamics::DYNAMIC_FREE_INITIAL);
}
if name == "Dynamics.FixedInitial" || name.ends_with(".Dynamics.FixedInitial") {
return Some(dynamics::FIXED_INITIAL);
}
if name == "Dynamics.SteadyStateInitial" || name.ends_with(".Dynamics.SteadyStateInitial") {
return Some(dynamics::STEADY_STATE_INITIAL);
}
if name == "Dynamics.SteadyState" || name.ends_with(".Dynamics.SteadyState") {
return Some(dynamics::STEADY_STATE);
}
if name == "GravityTypes.NoGravity" || name.ends_with(".GravityTypes.NoGravity") {
return Some(gravity_types::NO_GRAVITY);
}
if name == "GravityTypes.UniformGravity" || name.ends_with(".GravityTypes.UniformGravity") {
return Some(gravity_types::UNIFORM_GRAVITY);
}
if name == "GravityTypes.PointGravity" || name.ends_with(".GravityTypes.PointGravity") {
return Some(gravity_types::POINT_GRAVITY);
}
if name == "AssertionLevel.warning" || name.ends_with(".AssertionLevel.warning") {
return Some(assertion_level::WARNING);
}
if name == "AssertionLevel.error" || name.ends_with(".AssertionLevel.error") {
return Some(assertion_level::ERROR);
}
if name == "AnalogFilter.CriticalDamping" || name.ends_with(".AnalogFilter.CriticalDamping") {
return Some(analog_filter::CRITICAL_DAMPING);
}
if name == "AnalogFilter.Bessel" || name.ends_with(".AnalogFilter.Bessel") {
return Some(analog_filter::BESSEL);
}
if name == "AnalogFilter.Butterworth" || name.ends_with(".AnalogFilter.Butterworth") {
return Some(analog_filter::BUTTERWORTH);
}
if name == "AnalogFilter.ChebyshevI" || name.ends_with(".AnalogFilter.ChebyshevI") {
return Some(analog_filter::CHEBYSHEV_I);
}
if name == "FilterType.LowPass" || name.ends_with(".FilterType.LowPass") {
return Some(filter_type::LOW_PASS);
}
if name == "FilterType.HighPass" || name.ends_with(".FilterType.HighPass") {
return Some(filter_type::HIGH_PASS);
}
if name == "FilterType.BandPass" || name.ends_with(".FilterType.BandPass") {
return Some(filter_type::BAND_PASS);
}
if name == "FilterType.BandStop" || name.ends_with(".FilterType.BandStop") {
return Some(filter_type::BAND_STOP);
}
if name == "SimpleController.P" || name.ends_with(".SimpleController.P") {
return Some(simple_controller::P);
}
if name == "SimpleController.PI" || name.ends_with(".SimpleController.PI") {
return Some(simple_controller::PI);
}
if name == "SimpleController.PD" || name.ends_with(".SimpleController.PD") {
return Some(simple_controller::PD);
}
if name == "SimpleController.PID" || name.ends_with(".SimpleController.PID") {
return Some(simple_controller::PID);
}
None
}
pub fn builtin_enumeration_names() -> Vec<String> {
vec![
"StateSelect".to_string(),
"StateSelect.never".to_string(),
"StateSelect.avoid".to_string(),
"StateSelect.default".to_string(),
"StateSelect.prefer".to_string(),
"StateSelect.always".to_string(),
"Init".to_string(),
"Init.NoInit".to_string(),
"Init.SteadyState".to_string(),
"Init.InitialState".to_string(),
"Init.InitialOutput".to_string(),
"Dynamics".to_string(),
"Dynamics.DynamicFreeInitial".to_string(),
"Dynamics.FixedInitial".to_string(),
"Dynamics.SteadyStateInitial".to_string(),
"Dynamics.SteadyState".to_string(),
"GravityTypes".to_string(),
"GravityTypes.NoGravity".to_string(),
"GravityTypes.UniformGravity".to_string(),
"GravityTypes.PointGravity".to_string(),
"AssertionLevel".to_string(),
"AssertionLevel.warning".to_string(),
"AssertionLevel.error".to_string(),
"AnalogFilter".to_string(),
"AnalogFilter.CriticalDamping".to_string(),
"AnalogFilter.Bessel".to_string(),
"AnalogFilter.Butterworth".to_string(),
"AnalogFilter.ChebyshevI".to_string(),
"FilterType".to_string(),
"FilterType.LowPass".to_string(),
"FilterType.HighPass".to_string(),
"FilterType.BandPass".to_string(),
"FilterType.BandStop".to_string(),
"SimpleController".to_string(),
"SimpleController.P".to_string(),
"SimpleController.PI".to_string(),
"SimpleController.PD".to_string(),
"SimpleController.PID".to_string(),
]
}