@@ -53,7 +53,6 @@ function _model_macro(mod, fullname::Union{Expr, Symbol}, expr, isconnector)
5353    end 
5454    exprs =  Expr (:block )
5555    dict =  Dict {Symbol, Any} (
56-         :constants  =>  Dict {Symbol, Dict} (),
5756        :defaults  =>  Dict {Symbol, Any} (),
5857        :kwargs  =>  Dict {Symbol, Dict} (),
5958        :structural_parameters  =>  Dict {Symbol, Dict} ()
@@ -125,7 +124,7 @@ function _model_macro(mod, fullname::Union{Expr, Symbol}, expr, isconnector)
125124    description =  get (dict, :description , " " 
126125
127126    @inline  pop_structure_dict! .(
128-         Ref (dict), [:constants  ,  : defaults:kwargs , :structural_parameters ])
127+         Ref (dict), [:defaults , :kwargs , :structural_parameters ])
129128
130129    sys =  :($ type ($ (flatten_equations)(equations), $ iv, variables, parameters;
131130        name, description =  $ description, systems, gui_metadata =  $ gui_metadata,
@@ -320,6 +319,10 @@ Base.@nospecializeinfer function parse_variable_def!(
320319                Meta. isexpr (a, :call ) &&  assert_unique_independent_var (dict, a. args[end ])
321320                var =  :($ varname =  $ first (@parameters  ($ a[$ (indices... )]:: $type  =  $ varval),
322321                $ meta_val))
322+             elseif  varclass ==  :constants 
323+                 Meta. isexpr (a, :call ) &&  assert_unique_independent_var (dict, a. args[end ])
324+                 var =  :($ varname =  $ first (@constants  ($ a[$ (indices... )]:: $type  =  $ varval),
325+                 $ meta_val))
323326            else 
324327                Meta. isexpr (a, :call ) || 
325328                    throw (" $a  is not a variable of the independent variable" 
@@ -351,6 +354,12 @@ Base.@nospecializeinfer function parse_variable_def!(
351354                    var =  :($ varname =  $ varname ===  $ NO_VALUE ?  $ val :  $ varname;
352355                    $ varname =  $ first (@parameters  ($ a[$ (indices... )]:: $type  =  $ varval),
353356                    $ (def_n_meta... )))
357+                 elseif  varclass ==  :constants 
358+                     Meta. isexpr (a, :call ) && 
359+                         assert_unique_independent_var (dict, a. args[end ])
360+                     var =  :($ varname =  $ varname ===  $ NO_VALUE ?  $ val :  $ varname;
361+                     $ varname =  $ first (@constants  ($ a[$ (indices... )]:: $type  =  $ varval),
362+                     $ (def_n_meta... )))
354363                else 
355364                    Meta. isexpr (a, :call ) || 
356365                        throw (" $a  is not a variable of the independent variable" 
@@ -366,6 +375,11 @@ Base.@nospecializeinfer function parse_variable_def!(
366375                        assert_unique_independent_var (dict, a. args[end ])
367376                    var =  :($ varname =  $ varname ===  $ NO_VALUE ?  $ def_n_meta :  $ varname;
368377                    $ varname =  $ first (@parameters  $ a[$ (indices... )]:: $type  =  $ varname))
378+                 elseif  varclass ==  :constants 
379+                     Meta. isexpr (a, :call ) && 
380+                         assert_unique_independent_var (dict, a. args[end ])
381+                     var =  :($ varname =  $ varname ===  $ NO_VALUE ?  $ def_n_meta :  $ varname;
382+                     $ varname =  $ first (@constants  $ a[$ (indices... )]:: $type  =  $ varname))
369383                else 
370384                    Meta. isexpr (a, :call ) || 
371385                        throw (" $a  is not a variable of the independent variable" 
@@ -393,6 +407,9 @@ Base.@nospecializeinfer function parse_variable_def!(
393407            if  varclass ==  :parameters 
394408                Meta. isexpr (a, :call ) &&  assert_unique_independent_var (dict, a. args[end ])
395409                var =  :($ varname =  $ first (@parameters  $ a[$ (indices... )]:: $type  =  $ varname))
410+             elseif  varclass ==  :constants 
411+                 Meta. isexpr (a, :call ) &&  assert_unique_independent_var (dict, a. args[end ])
412+                 var =  :($ varname =  $ first (@constants  $ a[$ (indices... )]:: $type  =  $ varname))
396413            elseif  varclass ==  :variables 
397414                Meta. isexpr (a, :call ) || 
398415                    throw (" $a  is not a variable of the independent variable" 
@@ -453,6 +470,8 @@ function generate_var(a, varclass; type = Real)
453470    var =  Symbolics. variable (a; T =  type)
454471    if  varclass ==  :parameters 
455472        var =  toparam (var)
473+     elseif  varclass ==  :constants 
474+         var =  toconstant (var)
456475    elseif  varclass ==  :independent_variables 
457476        var =  toiv (var)
458477    end 
@@ -513,6 +532,8 @@ function generate_var!(dict, a, b, varclass, mod;
513532    end 
514533    if  varclass ==  :parameters 
515534        var =  toparam (var)
535+     elseif  varclass ==  :constants 
536+         var =  toconstant (var)
516537    end 
517538    var
518539end 
@@ -622,7 +643,7 @@ function parse_model!(exprs, comps, ext, eqs, icon, vs, ps, sps, c_evts, d_evts,
622643    elseif  mname ==  Symbol (" @equations" 
623644        parse_equations! (exprs, eqs, dict, body)
624645    elseif  mname ==  Symbol (" @constants" 
625-         parse_constants !mod )
646+         parse_variables !ps,  dict, mod,  body, :constants , kwargs, where_types )
626647    elseif  mname ==  Symbol (" @continuous_events" 
627648        parse_continuous_events! (c_evts, dict, body)
628649    elseif  mname ==  Symbol (" @discrete_events" 
@@ -643,49 +664,6 @@ function parse_model!(exprs, comps, ext, eqs, icon, vs, ps, sps, c_evts, d_evts,
643664    end 
644665end 
645666
646- function  parse_constants! (exprs, dict, body, mod)
647-     Base. remove_linenums! (body)
648-     for  arg in  body. args
649-         MLStyle. @match  arg begin 
650-             Expr (:(= ), Expr (:(:: ), a, type), Expr (:tuple , b, metadata)) ||  Expr (:(= ), Expr (:(:: ), a, type), b) =>  begin 
651-                 type =  getfield (mod, type)
652-                 b =  _type_check! (get_var (mod, b), a, type, :constants )
653-                 push! (exprs,
654-                     :($ (Symbolics. _parse_vars (
655-                         :constants , type, [:($ a =  $ b), metadata], toconstant))))
656-                 dict[:constants ][a] =  Dict (:value  =>  b, :type  =>  type)
657-                 if  @isdefined  metadata
658-                     for  data in  metadata. args
659-                         dict[:constants ][a][data. args[1 ]] =  data. args[2 ]
660-                     end 
661-                 end 
662-             end 
663-             Expr (:(= ), a, Expr (:tuple , b, metadata)) =>  begin 
664-                 push! (exprs,
665-                     :($ (Symbolics. _parse_vars (
666-                         :constants , Real, [:($ a =  $ b), metadata], toconstant))))
667-                 dict[:constants ][a] =  Dict {Symbol, Any} (:value  =>  get_var (mod, b))
668-                 for  data in  metadata. args
669-                     dict[:constants ][a][data. args[1 ]] =  data. args[2 ]
670-                 end 
671-             end 
672-             Expr (:(= ), a, b) =>  begin 
673-                 push! (exprs,
674-                     :($ (Symbolics. _parse_vars (
675-                         :constants , Real, [:($ a =  $ b)], toconstant))))
676-                 dict[:constants ][a] =  Dict (:value  =>  get_var (mod, b))
677-             end 
678-             _ =>  error (""" Malformed constant definition `$arg `. Please use the following syntax:
679-                 ``` 
680-                 @constants begin 
681-                     var = value, [description = "This is an example constant."] 
682-                 end 
683-                 ``` 
684-             """  )
685-         end 
686-     end 
687- end 
688- 
689667push_additional_defaults! (dict, a, b:: Number ) =  dict[:defaults ][a] =  b
690668push_additional_defaults! (dict, a, b:: QuoteNode ) =  dict[:defaults ][a] =  b. value
691669function  push_additional_defaults! (dict, a, b:: Expr )
@@ -950,6 +928,7 @@ function handle_conditional_vars!(
950928        arg, conditional_branch, mod, varclass, kwargs, where_types)
951929    conditional_dict =  Dict (:kwargs  =>  Dict (),
952930        :parameters  =>  Any[Dict {Symbol, Dict{Symbol, Any}} ()],
931+         :constants  =>  Any[Dict {Symbol, Dict{Symbol, Any}} ()],
953932        :variables  =>  Any[Dict {Symbol, Dict{Symbol, Any}} ()])
954933    for  _arg in  arg. args
955934        name, ex =  parse_variable_arg (
@@ -964,7 +943,7 @@ function prune_conditional_dict!(conditional_tuple::Tuple)
964943    prune_conditional_dict! .(collect (conditional_tuple))
965944end 
966945function  prune_conditional_dict! (conditional_dict:: Dict )
967-     for  k in  [:parameters , :variables ]
946+     for  k in  [:parameters , :variables ,  :constants ]
968947        length (conditional_dict[k]) ==  1  &&  isempty (first (conditional_dict[k])) && 
969948            delete! (conditional_dict, k)
970949    end 
981960
982961function  get_conditional_dict! (conditional_dict:: Dict , conditional_y_tuple:: Dict )
983962    merge! (conditional_dict[:kwargs ], conditional_y_tuple[:kwargs ])
984-     for  key in  [:parameters , :variables ]
963+     for  key in  [:parameters , :variables ,  :constants ]
985964        merge! (conditional_dict[key][1 ], conditional_y_tuple[key][1 ])
986965    end 
987966    conditional_dict
@@ -1000,6 +979,7 @@ function push_conditional_dict!(dict, condition, conditional_dict,
1000979    end 
1001980    conditional_y_dict =  Dict (:kwargs  =>  Dict (),
1002981        :parameters  =>  Any[Dict {Symbol, Dict{Symbol, Any}} ()],
982+         :constants  =>  Any[Dict {Symbol, Dict{Symbol, Any}} ()],
1003983        :variables  =>  Any[Dict {Symbol, Dict{Symbol, Any}} ()])
1004984    get_conditional_dict! (conditional_y_dict, conditional_y_tuple)
1005985
0 commit comments