@@ -170,7 +170,7 @@ def __init__(self):
170170 self .submodules = _ModuleBuilderSubmodules (self )
171171 self .domains = _ModuleBuilderDomainSet (self )
172172
173- self ._statements = Statement . cast ([])
173+ self ._statements = {}
174174 self ._ctrl_context = None
175175 self ._ctrl_stack = []
176176
@@ -234,7 +234,7 @@ def If(self, cond):
234234 "src_locs" : [],
235235 })
236236 try :
237- _outer_case , self ._statements = self ._statements , []
237+ _outer_case , self ._statements = self ._statements , {}
238238 self .domain ._depth += 1
239239 yield
240240 self ._flush_ctrl ()
@@ -254,7 +254,7 @@ def Elif(self, cond):
254254 if if_data is None or if_data ["depth" ] != self .domain ._depth :
255255 raise SyntaxError ("Elif without preceding If" )
256256 try :
257- _outer_case , self ._statements = self ._statements , []
257+ _outer_case , self ._statements = self ._statements , {}
258258 self .domain ._depth += 1
259259 yield
260260 self ._flush_ctrl ()
@@ -273,7 +273,7 @@ def Else(self):
273273 if if_data is None or if_data ["depth" ] != self .domain ._depth :
274274 raise SyntaxError ("Else without preceding If/Elif" )
275275 try :
276- _outer_case , self ._statements = self ._statements , []
276+ _outer_case , self ._statements = self ._statements , {}
277277 self .domain ._depth += 1
278278 yield
279279 self ._flush_ctrl ()
@@ -341,7 +341,7 @@ def Case(self, *patterns):
341341 continue
342342 new_patterns = (* new_patterns , pattern .value )
343343 try :
344- _outer_case , self ._statements = self ._statements , []
344+ _outer_case , self ._statements = self ._statements , {}
345345 self ._ctrl_context = None
346346 yield
347347 self ._flush_ctrl ()
@@ -364,7 +364,7 @@ def Default(self):
364364 warnings .warn ("A case defined after the default case will never be active" ,
365365 SyntaxWarning , stacklevel = 3 )
366366 try :
367- _outer_case , self ._statements = self ._statements , []
367+ _outer_case , self ._statements = self ._statements , {}
368368 self ._ctrl_context = None
369369 yield
370370 self ._flush_ctrl ()
@@ -416,7 +416,7 @@ def State(self, name):
416416 if name not in fsm_data ["encoding" ]:
417417 fsm_data ["encoding" ][name ] = len (fsm_data ["encoding" ])
418418 try :
419- _outer_case , self ._statements = self ._statements , []
419+ _outer_case , self ._statements = self ._statements , {}
420420 self ._ctrl_context = None
421421 yield
422422 self ._flush_ctrl ()
@@ -453,28 +453,42 @@ def _pop_ctrl(self):
453453 if_tests , if_bodies = data ["tests" ], data ["bodies" ]
454454 if_src_locs = data ["src_locs" ]
455455
456- tests , cases = [], OrderedDict ()
457- for if_test , if_case in zip (if_tests + [None ], if_bodies ):
458- if if_test is not None :
459- if len (if_test ) != 1 :
460- if_test = if_test .bool ()
461- tests .append (if_test )
456+ domains = set ()
457+ for if_case in if_bodies :
458+ domains |= set (if_case )
462459
463- if if_test is not None :
464- match = ("1" + "-" * (len (tests ) - 1 )).rjust (len (if_tests ), "-" )
465- else :
466- match = None
467- cases [match ] = if_case
460+ for domain in domains :
461+ tests , cases = [], OrderedDict ()
462+ for if_test , if_case in zip (if_tests + [None ], if_bodies ):
463+ if if_test is not None :
464+ if len (if_test ) != 1 :
465+ if_test = if_test .bool ()
466+ tests .append (if_test )
468467
469- self ._statements .append (Switch (Cat (tests ), cases ,
470- src_loc = src_loc , case_src_locs = dict (zip (cases , if_src_locs ))))
468+ if if_test is not None :
469+ match = ("1" + "-" * (len (tests ) - 1 )).rjust (len (if_tests ), "-" )
470+ else :
471+ match = None
472+ cases [match ] = if_case .get (domain , [])
473+
474+ self ._statements .setdefault (domain , []).append (Switch (Cat (tests ), cases ,
475+ src_loc = src_loc , case_src_locs = dict (zip (cases , if_src_locs ))))
471476
472477 if name == "Switch" :
473478 switch_test , switch_cases = data ["test" ], data ["cases" ]
474479 switch_case_src_locs = data ["case_src_locs" ]
475480
476- self ._statements .append (Switch (switch_test , switch_cases ,
477- src_loc = src_loc , case_src_locs = switch_case_src_locs ))
481+ domains = set ()
482+ for stmts in switch_cases .values ():
483+ domains |= set (stmts )
484+
485+ for domain in domains :
486+ domain_cases = OrderedDict ()
487+ for patterns , stmts in switch_cases .items ():
488+ domain_cases [patterns ] = stmts .get (domain , [])
489+
490+ self ._statements .setdefault (domain , []).append (Switch (switch_test , domain_cases ,
491+ src_loc = src_loc , case_src_locs = switch_case_src_locs ))
478492
479493 if name == "FSM" :
480494 fsm_signal , fsm_reset , fsm_encoding , fsm_decoding , fsm_states = \
@@ -490,10 +504,20 @@ def _pop_ctrl(self):
490504 # The FSM is encoded such that the state with encoding 0 is always the reset state.
491505 fsm_decoding .update ((n , s ) for s , n in fsm_encoding .items ())
492506 fsm_signal .decoder = lambda n : f"{ fsm_decoding [n ]} /{ n } "
493- self ._statements .append (Switch (fsm_signal ,
494- OrderedDict ((fsm_encoding [name ], stmts ) for name , stmts in fsm_states .items ()),
495- src_loc = src_loc , case_src_locs = {fsm_encoding [name ]: fsm_state_src_locs [name ]
496- for name in fsm_states }))
507+
508+ domains = set ()
509+ for stmts in fsm_states .values ():
510+ domains |= set (stmts )
511+
512+ for domain in domains :
513+ domain_states = OrderedDict ()
514+ for state , stmts in fsm_states .items ():
515+ domain_states [state ] = stmts .get (domain , [])
516+
517+ self ._statements .setdefault (domain , []).append (Switch (fsm_signal ,
518+ OrderedDict ((fsm_encoding [name ], stmts ) for name , stmts in domain_states .items ()),
519+ src_loc = src_loc , case_src_locs = {fsm_encoding [name ]: fsm_state_src_locs [name ]
520+ for name in fsm_states }))
497521
498522 def _add_statement (self , assigns , domain , depth ):
499523 def domain_name (domain ):
@@ -523,7 +547,7 @@ def domain_name(domain):
523547 "already driven from d.{}"
524548 .format (signal , domain_name (domain ), domain_name (cd_curr )))
525549
526- self ._statements .append (stmt )
550+ self ._statements .setdefault ( domain , []). append (stmt )
527551
528552 def _add_submodule (self , submodule , name = None ):
529553 if not hasattr (submodule , "elaborate" ):
@@ -559,7 +583,8 @@ def elaborate(self, platform):
559583 fragment .add_subfragment (Fragment .get (self ._named_submodules [name ], platform ), name )
560584 for submodule in self ._anon_submodules :
561585 fragment .add_subfragment (Fragment .get (submodule , platform ), None )
562- fragment .add_statements (self ._statements )
586+ for domain , statements in self ._statements .items ():
587+ fragment .add_statements (domain , statements )
563588 for signal , domain in self ._driving .items ():
564589 fragment .add_driver (signal , domain )
565590 fragment .add_domains (self ._domains .values ())
0 commit comments