Skip to content

Commit 6f4b590

Browse files
committed
Make default value units consistent
1 parent ec870e2 commit 6f4b590

File tree

1 file changed

+33
-14
lines changed

1 file changed

+33
-14
lines changed

src/systems/model_parsing.jl

Lines changed: 33 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ function _model_macro(mod, name, expr, isconnector)
5151
c_evts = []
5252
d_evts = []
5353
kwargs = OrderedCollections.OrderedSet()
54-
where_types = Expr[]
54+
where_types = Union{Symbol, Expr}[]
5555

5656
push!(exprs.args, :(variables = []))
5757
push!(exprs.args, :(parameters = []))
@@ -143,9 +143,17 @@ end
143143
pop_structure_dict!(dict, key) = length(dict[key]) == 0 && pop!(dict, key)
144144

145145
function update_kwargs_and_metadata!(dict, kwargs, a, def, indices, type, var,
146-
varclass, where_types)
146+
varclass, where_types, meta)
147147
if indices isa Nothing
148-
push!(kwargs, Expr(:kw, Expr(:(::), a, Union{Nothing, type}), nothing))
148+
kwtype = if !isnothing(meta) && haskey(meta, VariableUnit)
149+
dim = dimension(eval(meta[VariableUnit]))
150+
units = gensym(:U)
151+
push!(where_types, units)
152+
Expr(:curly, Union, :Nothing, Expr(:curly, Quantity, Expr(:(<:), type), dim, units))
153+
else
154+
Expr(:curly, Union, Nothing, type)
155+
end
156+
push!(kwargs, Expr(:kw, Expr(:(::), a, kwtype), nothing))
149157
dict[:kwargs][getname(var)] = Dict(:value => def, :type => type)
150158
else
151159
vartype = gensym(:T)
@@ -166,7 +174,7 @@ end
166174

167175
function parse_variable_def!(dict, mod, arg, varclass, kwargs, where_types;
168176
def = nothing, indices::Union{Vector{UnitRange{Int}}, Nothing} = nothing,
169-
type::Type = Real)
177+
meta = nothing, type::Type = Real)
170178
metatypes = [(:connection_type, VariableConnectType),
171179
(:description, VariableDescription),
172180
(:unit, VariableUnit),
@@ -186,7 +194,7 @@ function parse_variable_def!(dict, mod, arg, varclass, kwargs, where_types;
186194
a::Symbol => begin
187195
var = generate_var!(dict, a, varclass; indices, type)
188196
update_kwargs_and_metadata!(dict, kwargs, a, def, indices, type, var,
189-
varclass, where_types)
197+
varclass, where_types, meta)
190198
return var, def, Dict()
191199
end
192200
Expr(:(::), a, type) => begin
@@ -201,14 +209,14 @@ function parse_variable_def!(dict, mod, arg, varclass, kwargs, where_types;
201209
Expr(:call, a, b) => begin
202210
var = generate_var!(dict, a, b, varclass, mod; indices, type)
203211
update_kwargs_and_metadata!(dict, kwargs, a, def, indices, type, var,
204-
varclass, where_types)
212+
varclass, where_types, meta)
205213
return var, def, Dict()
206214
end
207215
Expr(:(=), a, b) => begin
208216
Base.remove_linenums!(b)
209217
def, meta = parse_default(mod, b)
210218
var, def, _ = parse_variable_def!(
211-
dict, mod, a, varclass, kwargs, where_types; def, type)
219+
dict, mod, a, varclass, kwargs, where_types; def, meta, type)
212220
if dict[varclass] isa Vector
213221
dict[varclass][1][getname(var)][:default] = def
214222
else
@@ -231,9 +239,9 @@ function parse_variable_def!(dict, mod, arg, varclass, kwargs, where_types;
231239
return var, def, Dict()
232240
end
233241
Expr(:tuple, a, b) => begin
234-
var, def, _ = parse_variable_def!(
235-
dict, mod, a, varclass, kwargs, where_types; type)
236242
meta = parse_metadata(mod, b)
243+
var, def, _ = parse_variable_def!(
244+
dict, mod, a, varclass, kwargs, where_types; meta, type)
237245
if meta !== nothing
238246
for (type, key) in metatypes
239247
if (mt = get(meta, key, nothing)) !== nothing
@@ -616,11 +624,22 @@ function parse_variable_arg(dict, mod, arg, varclass, kwargs, where_types)
616624
dict, mod, arg, varclass, kwargs, where_types)
617625
name = getname(vv)
618626

619-
varexpr = quote
620-
$name = if $name === nothing
621-
$setdefault($vv, $def)
622-
else
623-
$setdefault($vv, $name)
627+
varexpr = if haskey(metadata_with_exprs, VariableUnit)
628+
unit = metadata_with_exprs[VariableUnit]
629+
quote
630+
$name = if $name === nothing
631+
$setdefault($vv, $def)
632+
else
633+
$setdefault($vv, $ustrip($unit, $name))
634+
end
635+
end
636+
else
637+
quote
638+
$name = if $name === nothing
639+
$setdefault($vv, $def)
640+
else
641+
$setdefault($vv, $name)
642+
end
624643
end
625644
end
626645

0 commit comments

Comments
 (0)