@@ -198,25 +198,39 @@ function connection2set!(connectionsets, namespace, ss, isouter)
198
198
end
199
199
end
200
200
201
- function generate_connection_set (sys:: AbstractSystem )
201
+ function generate_connection_set (sys:: AbstractSystem , find = nothing , replace = nothing )
202
202
connectionsets = ConnectionSet[]
203
- sys = generate_connection_set! (connectionsets, sys)
203
+ sys = generate_connection_set! (connectionsets, sys, find, replace )
204
204
sys, merge (connectionsets)
205
205
end
206
206
207
- function generate_connection_set! (connectionsets, sys:: AbstractSystem , namespace = nothing )
207
+ function generate_connection_set! (connectionsets, sys:: AbstractSystem , find, replace,
208
+ namespace = nothing )
208
209
subsys = get_systems (sys)
209
210
210
211
isouter = generate_isouter (sys)
211
212
eqs′ = get_eqs (sys)
212
213
eqs = Equation[]
213
214
214
215
cts = [] # connections
216
+ extra_states = []
215
217
for eq in eqs′
216
- if eq. lhs isa Connection
217
- push! (cts, get_systems (eq. rhs))
218
+ lhs = eq. lhs
219
+ rhs = eq. rhs
220
+ if find != = nothing && find (rhs, namespace)
221
+ neweq, extra_state = replace (rhs, namespace)
222
+ if extra_state isa AbstractArray
223
+ append! (extra_states, unwrap .(extra_state))
224
+ elseif extra_state != = nothing
225
+ push! (extra_states, extra_state)
226
+ end
227
+ neweq isa AbstractArray ? append! (eqs, neweq) : push! (eqs, neweq)
218
228
else
219
- push! (eqs, eq) # split connections and equations
229
+ if lhs isa Number || lhs isa Symbolic
230
+ push! (eqs, eq) # split connections and equations
231
+ else
232
+ push! (cts, get_systems (rhs))
233
+ end
220
234
end
221
235
end
222
236
@@ -235,7 +249,10 @@ function generate_connection_set!(connectionsets, sys::AbstractSystem, namespace
235
249
end
236
250
237
251
# pre order traversal
238
- @set! sys. systems = map (s -> generate_connection_set! (connectionsets, s,
252
+ if ! isempty (extra_states)
253
+ @set! sys. states = [get_states (sys); extra_states]
254
+ end
255
+ @set! sys. systems = map (s -> generate_connection_set! (connectionsets, s, find, replace,
239
256
renamespace (namespace, nameof (s))),
240
257
subsys)
241
258
@set! sys. eqs = eqs
@@ -305,8 +322,9 @@ function generate_connection_equations_and_stream_connections(csets::AbstractVec
305
322
eqs, stream_connections
306
323
end
307
324
308
- function expand_connections (sys:: AbstractSystem ; debug = false , tol = 1e-10 )
309
- sys, csets = generate_connection_set (sys)
325
+ function expand_connections (sys:: AbstractSystem , find = nothing , replace = nothing ;
326
+ debug = false , tol = 1e-10 )
327
+ sys, csets = generate_connection_set (sys, find, replace)
310
328
ceqs, instream_csets = generate_connection_equations_and_stream_connections (csets)
311
329
_sys = expand_instream (instream_csets, sys; debug = debug, tol = tol)
312
330
sys = flatten (sys, true )
0 commit comments