@@ -21,6 +21,52 @@ function ClockInference(ts::TransformationState)
2121 ClockInference (ts, eq_domain, var_domain, inferred)
2222end
2323
24+ struct NotInferedTimeDomain end
25+ function error_sample_time (eq)
26+ error (" $eq \n contains `SampleTime` but it is not an infered discrete equation." )
27+ end
28+ function substitute_sample_time (ci:: ClockInference )
29+ @unpack ts, eq_domain = ci
30+ eqs = copy (equations (ts))
31+ @assert length (eqs) == length (eq_domain)
32+ for i in eachindex (eqs)
33+ eq = eqs[i]
34+ domain = eq_domain[i]
35+ dt = sampletime (domain)
36+ neweq = substitute_sample_time (eq, dt)
37+ if neweq isa NotInferedTimeDomain
38+ error_sample_time (eq)
39+ end
40+ eqs[i] = neweq
41+ end
42+ @set! ts. sys. eqs = eqs
43+ @set! ci. ts = ts
44+ end
45+
46+ function substitute_sample_time (eq:: Equation , dt)
47+ substitute_sample_time (eq. lhs, dt) ~ substitute_sample_time (eq. rhs, dt)
48+ end
49+
50+ function substitute_sample_time (ex, dt)
51+ istree (ex) || return ex
52+ op = operation (ex)
53+ args = arguments (ex)
54+ if op == SampleTime
55+ dt === nothing && return NotInferedTimeDomain ()
56+ return dt
57+ else
58+ new_args = similar (args)
59+ for (i, arg) in enumerate (args)
60+ ex_arg = substitute_sample_time (arg, dt)
61+ if ex_arg isa NotInferedTimeDomain
62+ return ex_arg
63+ end
64+ new_args[i] = ex_arg
65+ end
66+ similarterm (ex, op, new_args; metadata = metadata (ex))
67+ end
68+ end
69+
2470function infer_clocks! (ci:: ClockInference )
2571 @unpack ts, eq_domain, var_domain, inferred = ci
2672 @unpack var_to_diff, graph = ts. structure
@@ -66,6 +112,7 @@ function infer_clocks!(ci::ClockInference)
66112 end
67113 end
68114
115+ ci = substitute_sample_time (ci)
69116 return ci
70117end
71118
0 commit comments